YouTube Video Data Scraper - Views, Likes & Change Monitor avatar

YouTube Video Data Scraper - Views, Likes & Change Monitor

Pricing

from $1.46 / 1,000 video returneds

Go to Apify Store
YouTube Video Data Scraper - Views, Likes & Change Monitor

YouTube Video Data Scraper - Views, Likes & Change Monitor

For performance dashboards, media buying and influencer vetting: give it video URLs or ids and get views, likes, likes per thousand views, length, publish time, category, tags and captions. On 2026-09-07: 5,020,910 views, 95,353 likes, 18.99 per 1,000. Monitoring returns only real movement.

Pricing

from $1.46 / 1,000 video returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

YouTube Video Data Scraper — views, likes, and what actually changed

For tracking video performance over time and vetting a list of videos before you use them: give it video URLs or ids and every row comes back with the view count, the like count, likes per thousand views, the length, the publish time, the category, the uploader's tags, and which caption languages exist.

Measured on this Actor on 2026-09-07: view count 5,020,910, like count 95,353, 18.99 likes per 1,000 views, length 389 s — the like count being the number most scrapers cannot give you at all.

Monitoring is what this is for. viewDelta, likeDelta and changedFields give you the movement since the last run, so you can store a series without diffing anything yourself — and with monitoring on you are never charged twice for the same figures: a video comes back only when one of its numbers actually moves.

🔴 Leave the proxy on. Requested from Apify's own IP, YouTube answered with "Sign in to confirm you're not a bot" in place of the player data on 5 of 5 attempts — no video could be read at all. Through a proxy it reads normally. That is measured, and it is why the default is what it is.

No API key, no login. Export as JSON, CSV or Excel.

Best for

  • Tracking performance over time — viewDelta, likeDelta and changedFields give you the movement since the last run, so you can store a series without diffing anything yourself.
  • Vetting a list of videos — likes per thousand views next to the raw counts, plus whether captions exist, in one pass.
  • Feeding a dataset — tags, category, length and publish time are all on the row, so nothing needs a second request.

Measured on this Actor, 2026-09-07

Read from a real watch page (ngPkbaZliaU):

View count5,020,910
Like count95,353
Likes per 1,000 views18.99
Length389 s
Caption languages7
Uploader tags4
CategoryScience & Technology

🔴 Leave the proxy on. Requested from Apify's own IP, YouTube answered with "Sign in to confirm you're not a bot" in place of the player data on 5 of 5 attempts — no video could be read at all. Through a proxy the data came back on 10 of 10. This Actor reports that page as a bot check and retries on a new session; it never reports it as a video with no views.

One row per video

FieldWhat it is
input, videoId, videoUrlWhat you asked for and what it resolved to
title, descriptionFrom the video's own data, not the page heading
channelId, channelTitle, channelUrl, subscriberCountTextThe channel that published it
viewCount, likeCount, likesPerThousandViewsThe two counts, and the ratio — computed only when both are readable
lengthSecondsDuration
publishedAt, publishedAtRawThe same instant as ISO and as YouTube's own string
category, keywordsCategory and the tags the uploader set
hasCaptions, captionLanguagesWhether captions exist and in which languages
isLiveContent, isFamilySafe, allowRatings, availableCountryCountFlags YouTube publishes
thumbnailUrl, playabilityStatus, playabilityReasonThumbnail and whether it can be played
isFirstCheck, previousCheckedAt, previousViewCount, viewDelta, likeDelta, changedFieldsMonitoring

Everything comes from the video's own videoDetails block. A watch page is full of recommended videos from other channels; this Actor never reads ids out of that, and a page that resolves to a different video than the one you asked for is reported rather than returned.

Monitoring, and what it costs

Turn monitoring mode on and the numbers are remembered per video. On later runs:

  • a video whose numbers have not moved is not returned and not charged;
  • a video that moved comes back with viewDelta, likeDelta and changedFields;
  • a video it has never seen is always returned once.

The numbers are remembered per video, not per list, so adding a video to a list does not reset the history or re-charge the ones already being watched.

Monitoring adds a flat access fee of $5, charged once per calendar month (UTC), on the first monitoring run of that month — once, no matter how many lists or scheduled tasks you run. Runs with monitoring off never trigger it.

Rows that are never charged

  • no-such-video — YouTube said playabilityStatus: ERROR for it. The id may be wrong, or the video private, removed or region-locked.
  • blocked — YouTube answered with a bot check instead of the player data. This is not a statement about the video. The run retries on a new proxy session; if you see this row, every retry came back the same way.
  • incomplete-page — the page arrived without the player data and without a bot-check message. Reported rather than guessed at.
  • no-change — monitoring ran and nothing had moved.
  • no-match — videos were read and none matched your filters.
  • unreadable — the page could not be parsed, or the input was not a YouTube video.

Which pages this Actor requests

Only https://www.youtube.com/watch?v=<id>&hl=en&gl=US. YouTube's robots.txt disallows /results, /feeds/videos.xml and /youtubei/, and this Actor cannot be made to request them: anything that is not a video id or a video URL is rejected before any request is made.

Input

  • videos — URLs or 11-character ids. Watch links, youtu.be links, /shorts/ links and bare ids all work.
  • maxVideos — how many rows to return in total.
  • monitoringMode, monitorMode, resetMonitoringState — see above.
  • minViews / maxViews / minLengthSeconds / maxLengthSeconds / publishedAfter — numeric and date filters. A video whose count could not be read is kept, not treated as zero.
  • requireCaptions, excludeLive — keep only captioned videos, or drop live content.
  • keywords / keywordMatch / excludeKeywords — match on title, description, channel, tags and category.
  • useProxy — leave it on; see the measurement above.
{
"videos": [
"https://www.youtube.com/watch?v=aircAruvnKk",
"https://youtu.be/jNQXAC9IVRw"
],
"monitoringMode": true,
"monitorMode": "views-change",
"maxVideos": 100
}

Questions

Why is the like count missing on some videos? Because the uploader turned ratings off. allowRatings says so, and likeCount stays null rather than being filled with a zero.

Do I get charged for a video that does not exist? No. Only rows carrying video data are charged.

Why did every video come back as blocked? The proxy was off, or every retry hit a bot check. On Apify's own IP this happened on 5 of 5 attempts in the measurement above.

Can I use this to watch a whole channel? This Actor takes a list of videos. To list a channel's videos first, use the channel scraper below and feed its videoId column in here.

Other tools by NeverEmpty