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 back only the uploads it hasn't seen before: title, URL, publish date, view count and thumbnail. Duration and the Shorts flag need your own YouTube API key. $0.01 per new video; an empty poll costs just the $0.00005 start fee.
Pricing
from $10.00 / 1,000 new video detecteds
Rating
5.0
(1)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
YouTube Channel Monitor
Give it a list of channels. It gives you back the uploads it hasn't seen before. Run it again an hour later and you get only what went up in between. Most of the time that's an empty run.
Video IDs are kept in a named key-value store between runs, so a video is reported once and doesn't come back on the next poll. You aren't handed the same recent-uploads list over and over.
What a row looks like
{"videoId": "dQw4w9WgXcQ","title": "How we rebuilt the thing","url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ","channelId": "UCX6OQ3DkcsbYNE6H8uQQuVA","channelTitle": "Example Channel","publishedAt": "2026-08-21T14:02:11.000Z","durationSeconds": 742,"isShort": false,"viewCount": 18422,"thumbnail": "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg","sourceInput": "@examplechannel","detectedAt": "2026-08-21T15:00:04.312Z"}
sourceInput is whatever you typed for that channel, so you can join results back to your watch list. detectedAt is when this run found it, which is not the same as publishedAt.
Input
{"channels": ["@MrBeast", "https://youtube.com/@veritasium", "UCX6OQ3DkcsbYNE6H8uQQuVA"],"maxResultsPerChannel": 10,"onlyNewSinceLastRun": true,"maxVideoAgeHours": 48,"shortsOnly": false,"longFormOnly": false}
Channels can be @handles, full channel URLs, or bare UC… IDs, mixed freely in the same list.
| Field | Default | What it does |
|---|---|---|
channels | — | Required. Handles, URLs or UC IDs. |
maxResultsPerChannel | 10 | How far back to look each run, 1–50. Key mode only, see below. |
onlyNewSinceLastRun | true | Skip IDs seen in earlier runs. Turn it off to get the recent list every time. |
maxVideoAgeHours | 0 | Drop anything older than this. 0 means no age limit. |
minDurationSeconds / maxDurationSeconds | 0 | Duration window. Key mode only. |
shortsOnly / longFormOnly | false | Split on the 185-second Shorts boundary. Key mode only. |
youtubeApiKey | — | Optional, stored as a secret. |
Two modes, and the difference matters
Without a key it reads YouTube's public RSS feed for each channel. That works with no setup at all, but the feed is what it is: roughly the last 15 uploads, and no duration information. View counts do come through. durationSeconds and isShort don't, and come back null.
That breaks the four filters that read them, and it doesn't break them the same way. Set minDurationSeconds or shortsOnly in this mode and you get zero rows back, because a null duration compares as zero and a null Shorts flag reads as false. maxDurationSeconds and longFormOnly do the opposite and let everything past. So leave all four alone unless you're running with a key. maxResultsPerChannel is ignored here too, since the feed length isn't ours to choose. For a plain "tell me when they upload" trigger, none of that matters.
With a YouTube Data API key in youtubeApiKey you get real durations, the Shorts flag, view counts from the statistics endpoint, and history deeper than 15 videos. All the filters above start working. The key is yours, it stays a secret input, and it spends your own Google quota.
Other limits worth knowing
- Cross-run memory lives in a named key-value store called
yt-monitor-seenand holds the last 10,000 IDs. Beyond that, the oldest fall off the list and could in theory be reported again. - A channel that fails to resolve is logged as a warning and skipped. The run keeps going for the rest of the list.
viewCounton a fresh upload is a small number that will be stale within minutes. It's a snapshot, not a tracker.
Billing
$0.01 per new video returned, plus a $0.00005 run-start fee.
The start fee is the point of the design. A poll that finds nothing new pushes no rows and costs a twentieth of a cent, so watching twenty channels every fifteen minutes stays cheap and you only pay on the runs that find something.
Watch the first run, though. It has no memory yet, so it reports everything in the feed. Set maxVideoAgeHours if you want a ceiling on that.
Delivery
Rows land in the run's dataset and export as JSON, CSV or Excel. Because each run returns only the new ones, the run-finished webhook plus this dataset is enough to drive a Slack post, a Zap, or whatever else you want firing on upload.
