YouTube Video Stats Scraper — Views, Likes, Duration by URL
Pricing
from $15.00 / 1,000 video scrapeds
YouTube Video Stats Scraper — Views, Likes, Duration by URL
Get YouTube video stats and metadata by URL or video ID — view count, likes, duration, publish date, title, description, category, keywords, channel and caption languages. Bulk video lookup, no API key, no login, no quota. Filter by views or duration. Charged only for videos actually returned.
Pricing
from $15.00 / 1,000 video scrapeds
Rating
0.0
(0)
Developer
Nicholas Cheng
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
YouTube Video Stats Scraper
Give it YouTube links or video IDs, get one row of real numbers per video. View count, duration, publish date, likes, title, full description, category, keywords, channel, and which caption languages exist. No API key, no OAuth, no login, no quota to apply for. Accepts watch links, Shorts links, youtu.be links, embed links, or bare 11-character IDs.
You are charged only for videos that actually came back. A private, deleted, or region-blocked video produces an explanatory row and costs nothing.
| Input | Video URLs or IDs — any format YouTube itself accepts |
| Output | One row per video, numbers as numbers — plus the transcript if you tick includeSubtitles |
| Price | $0.015 per video — the same on every Apify plan |
| API key | Not needed. This does not use the YouTube Data API, so it does not consume your quota |
| Channels | Not fetched. This Actor is the videos-only mode of the YouTube Video & Channel Scraper; use that one to list a channel's recent videos |
What you get
{"itemType": "video","videoId": "aircAruvnKk","url": "https://www.youtube.com/watch?v=aircAruvnKk","title": "But what is a neural network? | Deep learning chapter 1","description": "Full text of the video description, not truncated.","durationSeconds": 1120,"viewCount": 23951183,"likesLabel": "like this video along with 512,000 other people","publishedAt": "2017-10-05T00:00:00-07:00","channelId": "UCYO_jab_esuFRV4b17AJtAw","channelName": "3Blue1Brown","channelUrl": "https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw","channelSubscribersLabel": "7.4M subscribers","keywords": ["neural networks", "deep learning", "machine learning"],"category": "Education","isLive": false,"thumbnail": "https://i.ytimg.com/vi/aircAruvnKk/maxresdefault.jpg","availableCaptions": [{ "language": "en", "name": "English", "isAutoGenerated": false }]}
viewCount and durationSeconds are real numbers, not display strings — you can sort and filter on
them without parsing "1.2M" first. likesLabel is a string on purpose: YouTube no longer exposes
an exact like count to logged-out clients, and inventing a number from a rounded label would be
making data up.
availableCaptions lists which caption tracks exist and in which languages. The text itself comes
with includeSubtitles:
Transcripts (optional, no extra charge)
transcript— the full text of the captions in the spoken language (human-written when the video has them, otherwise YouTube's auto-generated ones, de-duplicated);transcriptLanguageandtranscriptType(manual/auto-generated) say which.subtitles— the same track with timedsegments({ start, end, text }, seconds).- No captions on YouTube →
transcript: nullandsubtitlesNotesaying so.
Input
{"videoUrls": ["https://www.youtube.com/watch?v=aircAruvnKk","https://youtu.be/dQw4w9WgXcQ","https://www.youtube.com/shorts/…","jNQXAC9IVRw"],"minViews": 10000}
| Option | Default | Notes |
|---|---|---|
videoUrls | — | Watch, Shorts, youtu.be, embed links, or bare IDs. De-duplicated |
includeSubtitles | false | Also return the transcript with timestamps. Included in the per-video price |
minViews | 0 | Drop videos below this view count |
minDurationSeconds / maxDurationSeconds | 0 | Keep only videos in a length range — e.g. maxDurationSeconds: 60 for Shorts |
publishedAfter | — | ISO date; older videos are dropped |
titleContains | — | Keep only titles containing any of these phrases (case-insensitive) |
maxItems | 0 | Hard cap on rows for the run |
Videos that fail a filter are not delivered and not charged. They are counted under
filteredOut in the run summary.
Pricing
$0.015 per video, on every Apify plan — Free, Bronze, Silver, Gold, Platinum, Diamond. Check the Pricing tab: all six columns are identical. The price a listing advertises in its title is not always the price a free-plan run pays; here it is.
What you are not charged for
| What happens here | |
|---|---|
| Unavailable videos | Private, deleted, region-blocked, or mistyped IDs produce one row marked chargedForThis: false. Nothing is billed. |
| Filtered-out videos | A video that fails minViews or any other filter is not written and not billed. |
| Empty or placeholder rows | If the video data did not come back, no row is written. |
| The free plan | Same code path, same fields, same limits. No demo mode, no row cap, no nulls in place of data. |
What this Actor cannot do
- No speech recognition of our own. Transcripts are YouTube's own captions; a video without captions gets an empty transcript and a note. (An earlier version of this page said transcripts were impossible — that was true only of the web player's caption links, which were the only ones we had tested. YouTube's mobile app clients get caption links that need no proof-of-origin token, and that is what this Actor uses.)
- No channel listings. For "the latest videos from these channels", use the YouTube Video & Channel Scraper — same code, same prices, plus a $0.005 channel event.
- No exact like count. YouTube stopped exposing it to logged-out clients; you get YouTube's own rounded label.
- No comments, no search.
How it stays working
Video pages are loaded through a rotating residential connection — an ordinary browser-like request from an ordinary address, not a bypass of anything. Transcripts take one more request: the caption list is fetched the way YouTube's mobile apps fetch it (iOS, Android VR and Android clients in turn, fresh address each try, up to six tries), and the caption file is downloaded directly. Three rounds of fifteen videos: 14, 15 and 15 of 15 on a single pass; 170 of 170 caption downloads returned text. YouTube's page structure is read at runtime; if a video's data does not come back, the row is marked unavailable rather than filled with nulls.
Integrating
curl -X POST "https://api.apify.com/v2/acts/nick.cheng~youtube-video-stats/run-sync-get-dataset-items?token=<TOKEN>" \-H 'Content-Type: application/json' \-d '{"videoUrls":["aircAruvnKk","dQw4w9WgXcQ"]}'
Official clients exist for JavaScript and Python, and results export as JSON, CSV, or Excel.