YouTube Upload Monitor - New Video Tracker avatar

YouTube Upload Monitor - New Video Tracker

Pricing

from $10.00 / 1,000 new video detecteds

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, 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

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

5

Total users

2

Monthly active users

5 days ago

Last modified

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.

InputChannel links, @handles or UC ids
OutputOne row per newly seen upload
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$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
}
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"
}
FieldWhat it is
publishedAtAn 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, 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 number, and a snapshot of a video that is minutes old. Rounded the way YouTube shows it ("873K views") when estimated is true.
estimatedfalse when the time and view count are exact, true when they come from YouTube's rounded labels.
sourceInput, detectedAtYour original channel string, and when this run noticed the video.
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".

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

▶️ How to run it

  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?

$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 videoId 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.

🚧 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.

🧭 Which YouTube actor do you need?

If you wantUse
Only what is new since the last checkThis one
A channel's whole upload list, every runYouTube Channel Scraper
Keyword search results as well as channelsYouTube Scraper
A channel's Shorts, with exact view and like countsYouTube Shorts Scraper
The new video's transcriptYouTube 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.