YouTube Upload Monitor - New Video Tracker
Pricing
from $10.00 / 1,000 new video detecteds
YouTube Upload Monitor - New Video Tracker
Watch a list of YouTube channels and get only the new uploads: title, URL, length, publish time, views and thumbnail. Videos it has already seen are skipped. Without a YouTube API key, times and views are the rounded figures YouTube shows. $0.01 per new video.
Pricing
from $10.00 / 1,000 new video detecteds
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
2
Monthly active users
5 days ago
Last modified
Categories
Share
YouTube Upload Monitor: only the videos a channel has posted 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 |
| 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 | $0.01 per new video reported |
🔔 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 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 | What it is |
|---|---|
publishedAt | An ISO timestamp. 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 number, and a snapshot of a video that is minutes old. Rounded the way YouTube shows it ("873K views") when estimated is true. |
estimated | false when the time and view count are exact, true when they come from YouTube's rounded labels. |
sourceInput, detectedAt | Your original channel string, and when this run noticed the video. |
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".
Without an API key every row is estimated: true. Add a key if your pipeline needs exact times.
▶️ How to run it
- 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?
$0.01 per new video reported.
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.
The first run is the expensive one, because everything is new to it. maxVideoAgeHours is the
control.
💡 What people use it for
- Posting into Slack the moment a competitor publishes, without anyone watching a feed.
- Kicking off a pipeline on upload: pass
videoIdto 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.
🚧 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.
🧭 Which YouTube actor do you need?
| If you want | Use |
|---|---|
| Only what is new since the last check | This one |
| A channel's whole upload list, every run | YouTube Channel Scraper |
| Keyword search results as well as channels | YouTube Scraper |
| A channel's Shorts, with exact view and like counts | YouTube Shorts Scraper |
| The new video's transcript | YouTube Transcript 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.
How often should I run it? As often as you want the alert. A poll that finds nothing writes no rows.
Why did my first run return so much? It had no memory yet. Use maxVideoAgeHours to bound it.
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.
