YouTube Upload Monitor - New Video Tracker avatar

YouTube Upload Monitor - New Video Tracker

Pricing

from $9.70 / 1,000 new videos

Go to Apify Store
YouTube Upload Monitor - New Video Tracker

YouTube Upload Monitor - New Video Tracker

Watch a list of YouTube channels and get only the new uploads: title, URL, length, Shorts flag, publish time, views and thumbnail. Videos it has already reported are skipped. Without a YouTube API key, times and views are the rounded figures YouTube shows. $10.00 per 1,000 new videos ($0.01 each).

Pricing

from $9.70 / 1,000 new videos

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

2

Monthly active users

18 hours ago

Last modified

Share

Monitor YouTube channels for new uploads and get only what went up since your last check: give it a list of channels and it returns the uploads it has not seen before. Run it again an hour later and you get only what went up in between, which most of the time is nothing at all. Video ids are remembered between runs, so nobody hands you the same recent-uploads list over and over.

Watch the first run. It has no memory yet, so it reports every recent upload it can see for every channel on your list, and each of those rows is billed. Set maxVideoAgeHours before that first run if you want a ceiling on it.

InputChannel links, @handles or UC ids
OutputOne row per newly seen upload: title, link, channel, publish time, length, Shorts flag, views, thumbnail
Ceiling15 recent uploads per channel, or up to 50 with your own API key
Account neededNone. A YouTube Data API key is optional and makes upload times and view counts exact
Price$10.00 per 1,000 new videos, which is $0.01 each on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 500

🔍 What YouTube Upload Monitor does

Each run resolves your channels, reads their latest uploads, drops anything it has already reported, and writes what is left to the dataset. Delivered ids go into a named key-value store called yt-monitor-seen, which holds the last 10,000 and lives on your own Apify account.

That store is shared by every run, task and schedule of this actor on your account. One watch list on one schedule is the arrangement that behaves. Two schedules covering the same channels share one memory, and overlapping runs can lose an update and report it again on the next poll.

sourceInput carries the channel string exactly as you typed it, so you can join results back to your watch list. detectedAt is when this run found the video, which is not publishedAt.

📋 What data you get from each new YouTube upload

What you getField
Video id, title and watch linkvideoId, title, url
The channelchannelId, channelTitle
When it was publishedpublishedAt
Length, and whether it counts as a ShortdurationSeconds, isShort
Views at the moment it was foundviewCount
Thumbnailthumbnail
The description, with an API keydescription
Whether the time and views are exact or YouTube's rounded figuresestimated
Your channel string as typed, and when this run noticed the videosourceInput, detectedAt

▶️ How to scrape new uploads from YouTube channels

  1. Open YouTube Upload Monitor and click Try for free.
  2. Paste channels into Channels, one per line.
  3. Set Max video age (hours) for the first run, so it does not report the whole backlog.
  4. Click Start, then schedule it from the actor's Schedules tab once you are happy.
  5. Point a run-finished webhook at Slack, a Zap or your own endpoint. Each run holds only the new ones, so the dataset is the payload.

💰 How much does it cost to scrape new YouTube uploads?

$0.01 per new video reported on the Free plan, $0.0099 on Starter, $0.0098 on Scale and $0.0097 on Business. On the free plan, the $5 Apify gives you each month covers about 500 new videos.

A poll that finds nothing new writes no rows, so watching twenty channels every fifteen minutes stays cheap and you pay on the polls that find something. The notices in the key-value store are never charged.

📥 What you give it

{
"channels": ["@MrBeast", "https://youtube.com/@veritasium", "UCX6OQ3DkcsbYNE6H8uQQuVA"],
"onlyNewSinceLastRun": true,
"maxVideoAgeHours": 48
}
FieldDefaultWhat it is
channelsnoneRequired. Channel links, @handles or bare UC ids, mixed freely.
onlyNewSinceLastRuntrueSkip ids reported in earlier runs. Turn it off to get the recent list every time, and pay for it every time.
maxVideoAgeHours0Drop anything older than this many hours. 0 means no age limit.
maxResultsPerChannel10How far back to look per channel, 1 to 50. Needs an API key.
minDurationSeconds, maxDurationSeconds0Duration window in seconds. 0 means no limit. Works with or without a key.
shortsOnly, longFormOnlyfalseSplit on the 185 second boundary. Setting both returns nothing.
youtubeApiKeynoneOptional, stored as a secret. Your own key, spending your own Google quota.

Start it with channels empty and the run fails rather than returning a polite row.

📤 What you get back

A real row from a real run without an API key:

{
"videoId": "VKlulHwMxgU",
"title": "What happens when you open the valve?",
"url": "https://www.youtube.com/watch?v=VKlulHwMxgU",
"channelId": "UCHnyfMqiRRG1u-2MsSQLbXA",
"channelTitle": "Veritasium",
"publishedAt": "2026-09-25T05:58:28.768Z",
"durationSeconds": 94,
"isShort": true,
"viewCount": 873000,
"thumbnail": "https://i.ytimg.com/vi/VKlulHwMxgU/hqdefault.jpg",
"description": null,
"estimated": true,
"sourceInput": "@veritasium",
"detectedAt": "2026-09-26T05:58:28.768Z"
}
FieldHow to read it
publishedAtExact when estimated is false. When it is true, it was worked out from YouTube's own "1 day ago" label, so the upload can be up to one of those units older. null when YouTube gives no time, as for a scheduled premiere.
durationSeconds, isShortExact, with or without a key. null only in the rare run where a channel's upload list could not be read and YouTube's feed, which carries no length, stood in.
viewCountA snapshot of a video that is minutes old. Rounded the way YouTube shows it ("873K views") when estimated is true.
descriptionThe upload description with an API key. Without one it is null, because the upload list carries none.

🧾 Reading the output

Every dataset row is a newly seen video. There are no sample rows and no diagnostic rows mixed in: notices such as FILTER_NOT_APPLIED are written to a SAMPLE_AND_NOTICES record in the key-value store instead, so they cannot be mistaken for data and cannot bill.

A channel that fails to resolve is logged as a warning and skipped, and the rest of the list carries on. That means a typo in one handle shows up in the run log rather than in your rows, so check the log the first time you add channels. If no channel on the list can be read, the run fails with a CHANNELS_NOT_READ notice rather than ending empty, which would read as "nothing new".

NoticeWhat it means
TIME_LIMITThe run got close to its time limit and stopped on its own. The videos delivered before that are in the dataset, charged as usual and remembered as seen; the channels it did not reach are checked on the next run, so nothing is missed or charged twice. Give the run more time, or split a long channel list, if it keeps happening. The run ends as failed only when the time limit stopped it before any video came back.

Without an API key every row is estimated: true. Add a key if your pipeline needs exact times.

💡 What people use it for

  • Posting into Slack the moment a rival channel publishes, without anyone watching a feed.
  • Kicking off a pipeline on upload: pass the new video to a transcript or comments actor and have the summary waiting.
  • Keeping a dated record of what a set of channels shipped. Poll hourly and even an estimated publishedAt is right to the hour.
  • Watching a client's own channel so a missed upload does not go unnoticed for a week.

From an upload alert to a summary of what was said, in three runs:

  1. Schedule this on your watch list with Only new since last run on.
  2. Pass each new row's url into the Video URLs or IDs box of YouTube Transcript Scraper and summarise the text.
  3. A day later, pass the same url into the Video URLs box of YouTube Comments Scraper to read the first reactions.

🚧 What it does not do

  • Without a key you get the last 15 uploads per channel. maxResultsPerChannel is ignored.
  • Without a key, times are estimates. Upload times and view counts come from YouTube's rounded labels, marked estimated: true, and there is no description.
  • A row with no length skips the length filters. That only happens when a channel's upload list cannot be read and YouTube's feed stands in; the row comes back unfiltered and a FILTER_NOT_APPLIED notice says so.
  • isShort is a duration test, 185 seconds or less, not YouTube's own Shorts surface. A short video that is not a Short reads as one.
  • The memory holds 10,000 ids. Past that the oldest fall off and could in theory be reported again.
  • It is a trigger, not a tracker. viewCount is captured once, at detection.
  • No second opinion on a channel it cannot resolve. It is skipped with a log warning, not a row.
  • One watch list per account behaves best, because the seen-ids memory is shared across every run, task and schedule of this actor on your account.
  • It is not an official YouTube tool. Dami's Studio is independent and is not affiliated with or endorsed by YouTube or Google, or by any other company named on this page.

🧭 Which YouTube scraper do you need?

If you wantUse
Only the new uploads since your last checkThis one
A channel's uploads, up to 2,000 per runYouTube Channel Scraper
Keyword search results, or a channel's newest uploadsYouTube Scraper
Shorts from a channel or a keyword, with exact view and like countsYouTube Shorts Scraper
What a video says, as text, SRT and VTTYouTube Transcript Scraper
Comments under a videoYouTube Comments Scraper

❓ Questions people ask

Do I need a YouTube Data API key?

No. The channel's upload list is enough for "tell me when they upload", lengths included. A key gives exact times, the description and deeper history, on your own Google quota.

Where is the seen-ids memory kept?

In a named key-value store called yt-monitor-seen on your own Apify account, holding the last 10,000 ids.

How do I reset it?

Turn onlyNewSinceLastRun off for one run to get the current list regardless, or clear the seen-ids record in that store.

Why did my first run return so much?

It had no memory yet. Use maxVideoAgeHours to bound it.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/youtube-channel-monitor. Either way the run happens on your Apify account at the same price.

This reads public channel upload lists, nothing signed in. Results can still contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Include the channels you were watching and the run ID, and the log is enough for us to see what happened.