YouTube Scraper: Videos, Transcripts & Comments | from $1.80/1K
Pricing
from $1.75 / 1,000 video-results
YouTube Scraper: Videos, Transcripts & Comments | from $1.80/1K
Scrape YouTube video records: details, search, channels, transcripts, and comments. Return metadata, transcript text, and comment fields. Run with URLs, queries, or channels; no API key. Pricing: $0.0018/video-result + $0.00005/actor start on Free.
Pricing
from $1.75 / 1,000 video-results
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
26
Total users
8
Monthly active users
2 days ago
Last modified
Categories
Features
Share
YouTube Scraper for Videos, Transcripts & Comments
No API key is required to extract YouTube video metadata, search results, channel uploads, transcripts, and comments from YouTube pages and its internal InnerTube API. On the Free plan, you pay $0.0018 per video-result event and $0.00005 per apify-actor-start event.
- Collect views, dates, durations, descriptions, tags, and thumbnails for video analysis.
- Search topics and keywords for content research and video discovery.
- Monitor recent uploads from competitor channels.
- Extract joined transcript text, including auto-generated captions, for LLM pipelines.
- Fetch top comments for video analysis.
What you get
Choose one of five modes: video_details, search, channel_videos, transcript, or comments. Metadata comes from watch-page HTML, search and comments use InnerTube, channel uploads use channel-page data, and transcripts use youtube-transcript-api.
A field is null when its source does not provide the value.
| Field or field family | Modes | Type | What it contains |
|---|---|---|---|
video_id, mode | All | string | Video identifier and selected mode; video_id is null when unavailable. |
title | Video modes | string | Video title for video_details, search, and channel_videos; null when unavailable. |
channel, channel_id, channel_url | Video modes | string | Channel details when available; each field is null when unavailable. |
views | Video modes | integer | Parsed view count; null when unavailable. |
published | Video modes | ISO 8601 string or string | ISO-style publication data for details, or relative text for search and channel uploads; null when unavailable. |
duration_seconds, duration_raw | Video modes | integer or string | Numeric and formatted duration; each is null when unavailable. |
description, tags | video_details | string or array of strings | Video description and keyword tags; each is null when unavailable or empty. |
likes, comment_count | Video modes | null | Present in video records but always null; they are not filled in video_details, search, or channel_videos. Comment likes appear in comments mode. |
thumbnail, thumbnails | Video modes | string or array | Best thumbnail URL and available sizes; each is null when unavailable. |
video_url | Video modes | string | YouTube watch URL; null when the video ID is unavailable. |
language, is_generated | transcript | string or boolean | Transcript language and whether the caption track is generated; both are null when the transcript has no segments. |
transcript_text, segment_count | transcript | string or integer | Joined transcript text and number of segments; transcript_text is null when no transcript text is available, and segment_count is 0 when there are no segments. |
comment_id | comments | string | Comment identifier; null when unavailable. |
author, author_channel_id | comments | string | Comment author and channel identifier when available; each field is null when unavailable. |
text, likes, is_pinned | comments | string, integer, or boolean | Comment text, likes, and pinned status; text and likes are null when unavailable. |
published_raw | comments | string | Comment publication field; always null. |
parse_confidence, warnings | All | number or array of strings | Quality score from 0.0 to 1.0 and machine-readable warnings; warnings is empty when no warnings are recorded. |
scraped_at | All | ISO 8601 string | UTC timestamp for the record. |
Sample output
The sample is shortened by omitting the long description, tags, and thumbnails fields. All shown field names and values are copied from one dataset record.
{"video_id": "dQw4w9WgXcQ","mode": "video_details","title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)","channel": "Rick Astley","channel_id": "UCuAXFkgsw1L7xaCfnd5JJOw","channel_url": "https://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw","views": 1825709714,"likes": null, "comment_count": null,"published": "2009-10-24T23:57:33-07:00","duration_seconds": 213, "duration_raw": "3:33","thumbnail": "https://i.ytimg.com/vi_webp/dQw4w9WgXcQ/maxresdefault.webp","video_url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","parse_confidence": 1, "warnings": [],"scraped_at": "2026-10-12T00:12:31.497339+00:00"}
Pricing
This Actor uses pay-per-event pricing. One video-result event contains all fields for one pushed record. The apify-actor-start event is charged once per GB of run memory, with a minimum of one event.
| Plan | video-result | apify-actor-start |
|---|---|---|
| Free | $0.0018 per event | $0.00005 per event |
On the Free plan, 1,000 video-result events = $1.80 and 10,000 video-result events = $18.00, excluding the separate apify-actor-start charge.
You pay only for the events in the Pricing table above. This Actor does not use the Pay per event + usage option, so the platform usage of your runs (compute, proxy traffic and storage) is not billed to you separately. The Apify Free plan includes $5 of monthly platform usage credit.
On the Free plan, the $5 credit covers 2,777 video-result events when the run has one apify-actor-start event ($0.00005 per event).
How to use
- Select a mode:
video_details,search,channel_videos,transcript, orcomments. - Provide
videoUrlsfor video details, transcripts, or comments using YouTube URLs or bare video IDs. - Provide
searchQueriesfor keyword searches, orchannelsfor recent channel uploads. - Set
maxResults,maxComments, ortranscriptLanguageas needed. - Start the run and open the Dataset tab to see the records.
- Repeat runs through Apify Schedules, using daily as a starting point for monitoring channel uploads.
{"mode": "video_details","videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
mode | Selects video_details, search, channel_videos, transcript, or comments. | video_details |
videoUrls | YouTube URLs or bare video IDs for video details, transcripts, and comments. Invalid values are skipped. | No default |
searchQueries | Keywords used in search mode. | No default |
channels | Handles, channel IDs, or full channel URLs used in channel_videos mode. | No default |
maxResults | Maximum videos requested per search query or channel, from 1 to 500. Search stops after about 5 result pages (about 100 videos) per query, and channel listings stop after 10 pages, so a higher value may return fewer rows. | 20 |
transcriptLanguage | Preferred transcript language code, such as en, es, or de. If it is missing, the Actor falls back to auto-generated captions in any language, then to any available track. | en |
maxComments | Maximum top comments requested per video in comments mode, from 1 to 200. Comments stop after 5 pages per video, so a higher value may return fewer rows. | 20 |
proxyConfiguration | Optional Apify Proxy setting. The Actor uses only the proxyUrl it receives from this field; when the field is empty or has no proxyUrl, requests run without a proxy. | Empty |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
A mode has no corresponding input list, such as no videoUrls in video_details mode | The run completes as Succeeded with no records for that mode. A warning is logged, and an OUTPUT record is written to the run's default key-value store with the mode and totalItems. | Supply the list required by the selected mode. |
A videoUrls value is not a supported YouTube URL or bare video ID | The Actor logs that it could not extract a video ID and skips that value. | Use a YouTube watch URL or a bare 11-character video ID. |
| A search, channel, video-details, transcript or comments fetch raises an exception | The affected item produces no record and a warning is logged. Rows already pushed remain in the dataset. | Retry later or check the count with a one-result run. |
| A transcript has no segments | The transcript record has segment_count set to 0, a parse_confidence below 1.0, and a warning. | Check warnings. |
| The requested transcript language is unavailable | The Actor falls back to auto-generated captions in any language, then to any available track. The record's language and is_generated fields show which transcript was returned. | Check language and is_generated. |
| YouTube changes the HTML structure | parse_confidence can drop below 1.0. | Review warnings. |
| Search or channel results | Fields such as descriptions or tags for search results are null. | Use video_details for the full metadata record for a specific video. |
| A run is aborted, times out or fails during processing | Each record reaches the dataset before its video-result charge is attempted. Rows already pushed remain in the dataset, and items not yet processed produce no rows. | Start another run for the remaining inputs. |
FAQ
How much does it cost to scrape YouTube?
On the Free plan, video-result costs $0.0018 per event and apify-actor-start costs $0.00005 per event. 1,000 video-result events cost $1.80 on the Free plan, excluding the separate start charge.
What happens if the run returns an empty result?
An empty result can occur when the required input list is missing, video IDs cannot be extracted, or a fetch fails. The run completes as Succeeded when these handled conditions finish without records, warnings are logged, and the OUTPUT record in the run's default key-value store contains the mode and totalItems. Add valid mode-specific inputs, review the run log, and retry.
Why is my YouTube scrape not working?
Review the selected mode and its input field, then inspect warnings and parse_confidence. Retry later or check the result with a one-result run.
Why use this instead of the official YouTube Data API?
This Actor uses YouTube’s internal InnerTube API and HTML parsing and does not require an API key.
Is it legal or allowed to scrape YouTube public data?
This Actor extracts data from YouTube pages and YouTube’s internal InnerTube requests. Whether a particular use is legal or allowed depends on the source terms and applicable law for your use case, so review those requirements before running it.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.