YouTube Video Transcript avatar
YouTube Video Transcript

Pricing

$5.00 / 1,000 results

Go to Apify Store
YouTube Video Transcript

YouTube Video Transcript

This Apify Actor extracts full transcripts (with timestamps) and metadata from YouTube videos, including title, description, upload date, views, likes, channel info, and duration

Pricing

$5.00 / 1,000 results

Rating

5.0

(14)

Developer

starvibe

starvibe

Maintained by Community

Actor stats

16

Bookmarked

255

Total users

140

Monthly active users

3.8 hours

Issues response

8 days ago

Last modified

Share

YouTube Transcript and Metadata Extractor - Download Video Subtitles & Channel Data

Extract YouTube video transcripts, subtitles, and metadata effortlessly with this powerful Apify Actor. Download structured data from individual videos or entire channels, including titles, view counts, timestamps, and complete transcripts in multiple languages. Perfect for content analysis, research, SEO, and data mining.

Key Features

  • Extract YouTube Transcripts: Download complete video subtitles and captions in multiple languages
  • Channel Scraping: Fetch data from entire YouTube channels with customizable date ranges
  • Rich Metadata: Get video titles, descriptions, view counts, likes, comments, thumbnails, and more
  • Multi-language Support: Access transcripts in any available language using ISO 639-1 codes
  • Auto-generated Captions: Fallback to auto-generated subtitles when manual captions aren't available
  • Structured JSON Output: Export data in clean, structured JSON format for easy integration
  • Date Filtering: Filter channel videos by publication date range
  • No Scraping Required: Reliable data extraction without complex YouTube scraping

Use Cases

  • Content Research: Analyze video content and extract insights from transcripts
  • SEO & Marketing: Extract video metadata for competitive analysis and keyword research
  • Academic Research: Gather YouTube data for studies and analysis
  • Content Creation: Repurpose video transcripts for blog posts, articles, or social media
  • Data Analysis: Build datasets from YouTube channels for AI/ML training or analytics
  • Accessibility: Convert video content to text format for accessibility purposes
  • Media Monitoring: Track and analyze content from specific channels over time

Input

Provide either a YouTube video URL (for single video) or a channel URL (to fetch multiple videos). The Actor requires the following fields, defined in input_schema.json. Provide exactly one of youtube_url or channel_url; the backend will validate and ignore inapplicable fields:

FieldTypeDescriptionRequired
youtube_urlStringThe URL of the YouTube video (e.g., https://www.youtube.com/watch?v=dQw4w9WgXcQ). Use for single video fetch, paired with language.No (mutually exclusive with channel_url)
languageStringThe transcript language in ISO 639-1 format (e.g., en).No
channel_urlStringThe URL of the YouTube channel (e.g., https://www.youtube.com/@taostats or https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxxxxx). Use to fetch videos from the channel, paired with max_videos, start_date, and end_date.No (mutually exclusive with youtube_url)
max_videosIntegerMaximum number of videos to fetch from the channel (default: 10, range: 5-15). Only applicable with channel_url.No
start_dateStringStart date for filtering channel videos (Expected ISO 8601 format). Only applicable with channel_url; backend uses 30 days ago if blank. Ensure end_date >= start_date.No
end_dateStringEnd date for filtering channel videos (Expected ISO 8601 format). Only applicable with channel_url; backend uses today if blank. Ensure end_date >= start_date.No

Example Input (Single Video):

{
"youtube_url": "https://www.youtube.com/watch?v=6EeDKyS7pV8",
"language": "en"
}

Example Input (Channel Videos):

{
"channel_url": "https://www.youtube.com/@taostats",
"max_videos": 10,
"language": "en",
"start_date": "2025-08-17",
"end_date": "2025-09-16"
}

Output

The Actor saves data to the Apify dataset in a structured JSON format, as defined in dataset_schema.json. For single video, output is an array with one item; for channel, it's an array of video items. The output includes:

FieldTypeDescription
video_idStringThe unique identifier of the YouTube video.
titleStringThe title of the YouTube video.
channel_nameStringThe name of the YouTube channel.
channel_idStringThe unique identifier of the YouTube channel.
timestampIntegerThe Unix timestamp of when the video was published.
published_atStringThe UTC date and time of video upload (format: YYYY-MM-DD HH:MM:SSZ).
view_countIntegerThe number of views the video has received.
like_countIntegerThe number of likes the video has received.
comment_countIntegerThe number of comments on the video.
transcriptArrayAn array of transcript segments, each with text, start, and end timestamps.
urlStringThe URL of the YouTube video.
languageStringThe primary language of the transcript (e.g., en for English).
duration_secondsIntegerThe total duration of the video in seconds.
descriptionStringThe video description.
thumbnailStringThe URL of the video thumbnail image.
statusStringProcessing status (e.g., "success").
messageStringStatus message about the transcript fetch operation.
available_languagesArrayList of all available transcript languages for the video.
selected_languageStringThe language that was selected for the transcript.
is_auto_generatedBooleanWhether the transcript is auto-generated or manually created.
geo_restrictStringGeographic restrictions on the video, if any.

Sample Output Example:

[
{
"channel_id": "UC7TghOL755nBk7HelHoi9LQ",
"channel_name": "CoinDesk",
"comment_count": 1,
"duration_seconds": 86,
"language": "en",
"like_count": 14,
"timestamp": 1759059043,
"title": "This Bitcoin developer is on a power trip",
"transcript": [
{
"end": 2.639,
"start": 0.56,
"text": "Then the last one which is kind of the"
},
{
"end": 4.64,
"start": 2.639,
"text": "one that I kind of but my head against"
},
{
"end": 7.359,
"start": 4.64,
"text": "Luke with over the past three years was"
},
{
"end": 10.24,
"start": 7.359,
"text": "the BIPS repo. So what happened is"
},
{
"end": 12.16,
"start": 10.24,
"text": "because Luke is such a difficult person"
},
{
"end": 14.639,
"start": 12.16,
"text": "to work with and he loves having"
},
{
"end": 18,
"start": 14.639,
"text": "positions of authority when he was uh"
},
{
"end": 21.279,
"start": 18,
"text": "one of the uh editors of the BIPS the"
},
{
"end": 23.119,
"start": 21.279,
"text": "Bitcoin improvement proposal repo which"
},
{
"end": 24.72,
"start": 23.119,
"text": "is where people submit new ideas which"
},
{
"end": 26.8,
"start": 24.72,
"text": "are then cataloged and numbered. he"
},
{
"end": 29.439,
"start": 26.8,
"text": "became so difficult to work with um and"
},
{
"end": 31.519,
"start": 29.439,
"text": "coupled with people just naturally kind"
},
{
"end": 35.2,
"start": 31.519,
"text": "of leaving the space that um after a few"
},
{
"end": 38.64,
"start": 35.2,
"text": "years Luke found himself originally one"
},
{
"end": 41.2,
"start": 38.64,
"text": "of several BIP editors now the only BIP"
},
{
"end": 44.559,
"start": 41.2,
"text": "editor from 2023 till I think mid24 and"
},
{
"end": 49.28,
"start": 44.559,
"text": "during this time Luke refused to give uh"
},
{
"end": 51.12,
"start": 49.28,
"text": "BIP numbers to certain proposals"
},
{
"end": 54.8,
"start": 51.12,
"text": "including popular ones like like OPC cat"
},
{
"end": 57.6,
"start": 54.8,
"text": "and there is a well docu documented um"
},
{
"end": 59.76,
"start": 57.6,
"text": "push and pull an argument um people"
},
{
"end": 62.079,
"start": 59.76,
"text": "saying Luke please just give a number"
},
{
"end": 64.32,
"start": 62.079,
"text": "and Luke saying that he doesn't think"
},
{
"end": 67.2,
"start": 64.32,
"text": "these are serious proposals that is off"
},
{
"end": 69.84,
"start": 67.2,
"text": "that is a very very false and uh"
},
{
"end": 72.4,
"start": 69.84,
"text": "ridiculous statement to make then when"
},
{
"end": 75.76,
"start": 72.4,
"text": "BIP editors were added uh a lot of the"
},
{
"end": 78.88,
"start": 75.76,
"text": "uh BIP numbers were uh they started a"
},
{
"end": 80.799,
"start": 78.88,
"text": "lot of the the process resumed again but"
},
{
"end": 83.36,
"start": 80.799,
"text": "it basically required taking it uh away"
},
{
"end": 87.84,
"start": 83.36,
"text": "from just Luke's sole free."
}
],
"published_at": "2025-09-28T11:30:43Z",
"url": "https://www.youtube.com/watch?v=sGYS42SjRkg",
"video_id": "sGYS42SjRkg",
"view_count": 730,
"geo_restrict": null,
"status": "success",
"message": "Successfully fetched the transcript for the video with ID 'sGYS42SjRkg'",
"available_languages": [
"English (auto-generated)"
],
"selected_language": "English (auto-generated)",
"is_auto_generated": true,
"description": "🎧 Catch the latest episode of 'BITCOIN SEASON 2: Inside the Mind of Luke Dashjr, Bitcoin's Most Polarizing Developer,' in partnership with Blockspace Media!",
"thumbnail": "https://i.ytimg.com/vi/sGYS42SjRkg/maxresdefault.jpg"
}
]

Why Use This Actor?

  • Fast & Efficient: Extract YouTube video and channel data in seconds without manual scraping
  • Flexible Data Collection: Fetch single videos or bulk extract from entire channels with date filtering
  • Comprehensive Data: Get transcripts, metadata, engagement metrics, and thumbnails in one request
  • Reliable Performance: Built-in validation, error handling, and automatic language fallback
  • Easy Integration: Clean JSON output works seamlessly with any data pipeline or analytics tool
  • Cost-Effective: Pay-per-result pricing means you only pay for successful extractions

Pricing

This Actor uses a Pay Per Result (PPR) billing model:

  • $5.00 per 1,000 results
  • Each video processed (whether from a single video URL or channel URL) counts as one result
  • You are only charged for successfully processed videos that are saved to your dataset
  • Failed requests do not count towards your usage

Example: If you fetch 10 videos from a channel, you will be charged for 10 results ($0.05).

Troubleshooting

Invalid URL Format

Problem: Error message about invalid URL format.

Solution: Ensure your URL follows one of these formats:

  • Video URL: https://www.youtube.com/watch?v=VIDEO_ID
  • Channel URL (handle): https://www.youtube.com/@channelhandle
  • Channel URL (ID): https://www.youtube.com/channel/CHANNEL_ID

Transcript Not Available

Problem: Video returns no transcript or "transcript not available" error.

Solution:

  • Not all videos have transcripts/subtitles available
  • Check if the video has captions enabled on YouTube
  • Try a different language code if the requested language is not available
  • Check the available_languages field in the output to see what languages are available

Language Not Available

Problem: Requested language is not available for the video.

Solution:

  • The Actor will attempt to fetch the transcript in the requested language
  • If not available, it may fall back to auto-generated captions or other available languages
  • Check the available_languages field in the output to see supported languages
  • Use ISO 639-1 language codes (e.g., en, es, fr)

No Videos Found for Channel

Problem: Channel URL provided but no videos are returned.

Solution:

  • Verify the channel URL is correct and publicly accessible
  • Check your start_date and end_date range - there may be no videos published in that period
  • Adjust the max_videos parameter if needed (default: 10, range: 5-15)
  • Some channels may have restricted access or no public videos

Date Range Errors

Problem: Error about invalid date range.

Solution:

  • Ensure end_date is greater than or equal to start_date
  • Use ISO 8601 date format: YYYY-MM-DD
  • If dates are not provided, the Actor uses the last 30 days by default
  • Example valid range: "start_date": "2025-08-17", "end_date": "2025-09-16"

Channel Videos vs Single Video

Problem: Confused about which input fields to use.

Solution:

  • Use youtube_url + language for fetching a single video
  • Use channel_url + max_videos + start_date + end_date + language for fetching multiple videos from a channel
  • Do not provide both youtube_url and channel_url - they are mutually exclusive