YouTube Upload Monitor - New Video Tracker
Pricing
from $9.70 / 1,000 new videos
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
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
2
Monthly active users
18 hours ago
Last modified
Categories
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.
| Input | Channel links, @handles or UC ids |
| Output | One row per newly seen upload: title, link, channel, publish time, length, Shorts flag, views, thumbnail |
| Ceiling | 15 recent uploads per channel, or up to 50 with your own API key |
| Account needed | None. 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 get | Field |
|---|---|
| Video id, title and watch link | videoId, title, url |
| The channel | channelId, channelTitle |
| When it was published | publishedAt |
| Length, and whether it counts as a Short | durationSeconds, isShort |
| Views at the moment it was found | viewCount |
| Thumbnail | thumbnail |
| The description, with an API key | description |
| Whether the time and views are exact or YouTube's rounded figures | estimated |
| Your channel string as typed, and when this run noticed the video | sourceInput, detectedAt |
▶️ How to scrape new uploads from YouTube channels
- Open YouTube Upload Monitor and click Try for free.
- Paste channels into Channels, one per line.
- Set Max video age (hours) for the first run, so it does not report the whole backlog.
- Click Start, then schedule it from the actor's Schedules tab once you are happy.
- 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}
| Field | Default | What it is |
|---|---|---|
channels | none | Required. Channel links, @handles or bare UC ids, mixed freely. |
onlyNewSinceLastRun | true | Skip ids reported in earlier runs. Turn it off to get the recent list every time, and pay for it every time. |
maxVideoAgeHours | 0 | Drop anything older than this many hours. 0 means no age limit. |
maxResultsPerChannel | 10 | How far back to look per channel, 1 to 50. Needs an API key. |
minDurationSeconds, maxDurationSeconds | 0 | Duration window in seconds. 0 means no limit. Works with or without a key. |
shortsOnly, longFormOnly | false | Split on the 185 second boundary. Setting both returns nothing. |
youtubeApiKey | none | Optional, 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"}
| Field | How to read it |
|---|---|
publishedAt | Exact 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, isShort | Exact, 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. |
viewCount | A snapshot of a video that is minutes old. Rounded the way YouTube shows it ("873K views") when estimated is true. |
description | The 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".
| Notice | What it means |
|---|---|
TIME_LIMIT | The 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
publishedAtis 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:
- Schedule this on your watch list with Only new since last run on.
- Pass each new row's
urlinto the Video URLs or IDs box of YouTube Transcript Scraper and summarise thetext. - A day later, pass the same
urlinto 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.
maxResultsPerChannelis 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_APPLIEDnotice says so. isShortis 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.
viewCountis 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 want | Use |
|---|---|
| Only the new uploads since your last check | This one |
| A channel's uploads, up to 2,000 per run | YouTube Channel Scraper |
| Keyword search results, or a channel's newest uploads | YouTube Scraper |
| Shorts from a channel or a keyword, with exact view and like counts | YouTube Shorts Scraper |
| What a video says, as text, SRT and VTT | YouTube Transcript Scraper |
| Comments under a video | YouTube 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.
Is scraping YouTube legal?
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.