YouTube Monitor avatar

YouTube Monitor

Pricing

from $1.99 / 1,000 videos

Go to Apify Store
YouTube Monitor

YouTube Monitor

YouTube scraper with no API key and no quota limits. Extract new videos by keyword or channel: title, channel, views, duration, publish time, thumbnail and URL. Export JSON, CSV or Excel. Built-in dedupe returns only what is new since your last run. $1.99 per 1,000 videos.

Pricing

from $1.99 / 1,000 videos

Rating

0.0

(0)

Developer

Quiet Harvest

Quiet Harvest

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Share

YouTube Keyword Monitor — New Videos Only | $1.99 / 1K videos | No API Key

Watch YouTube for new videos on your keywords, or from the channels you follow — and get only what appeared since your last run.

No API key. No quota. No login. No cookies. This Actor reads public YouTube pages, so there is no Google Cloud project to set up, no daily quota to run out of, and no account to get flagged. If you have hit the YouTube Data API's daily unit limit, this is a drop-in alternative that does not have one.

$1.99 per 1,000 videos returned. Platform usage included — no second bill for compute or proxy.


This is a monitor, not a bulk scraper

Most YouTube scrapers are built to dump everything: give them a channel, get 20,000 videos back. That is a different job.

This one is built to run on a schedule and answer one question: what is new?

This ActorA bulk scraper
Built forRunning every 15 min, foreverOne big extraction
ReturnsOnly videos you have not seenEverything, every time
Repeat costYou pay for new videos onlyYou pay for the same videos again
DedupeBuilt in, 7-day memoryYou do it yourself
Typical runA handful of new videosThousands of rows

If you want a one-off bulk dump, use a bulk scraper. If you want an alerting feed, this is it.


What you can do with it

  • Brand and competitor monitoring — know within minutes when someone uploads a video mentioning your product
  • Trend watching — track a topic and collect every new video about it over weeks
  • Creator tracking — follow a list of channels and get their uploads as they land
  • Lead and partner discovery — find the channels publishing about your niche
  • AI agents and RAG — a clean, deduplicated feed of fresh video metadata
  • Alerting — pipe new videos into Slack, Discord, email or a webhook

Two inputs, mix freely

Keywords

{
"keywords": ["ai agents", "web scraping"],
"sort": "date",
"onlyNew": true
}

sort: date puts newest uploads first, which is what monitoring needs. relevance, views and rating are also available when you want ranking instead of recency.

Channels

{
"channels": ["@NASA", "@veritasium"],
"onlyNew": true
}

Handles work with or without the @, and full channel URLs are accepted too.

Both at once

{
"keywords": ["mars rover"],
"channels": ["@NASA"],
"sort": "date",
"onlyNew": true,
"maxAgeHours": 48
}

Every item is tagged with _source (search or channel) and _query so you can split them downstream.


Ready-made examples

Brand monitoring, every 15 minutes

{
"keywords": ["acme corp", "acme review"],
"sort": "date",
"onlyNew": true,
"maxAgeHours": 24
}

Follow a set of creators

{
"channels": ["@mkbhd", "@LinusTechTips", "@veritasium"],
"onlyNew": true
}

Only videos that already have traction

{
"keywords": ["product launch 2026"],
"sort": "views",
"minViews": 10000,
"onlyNew": true
}

Full snapshot, no dedupe (one-off research)

{
"keywords": ["electric vehicle review"],
"sort": "relevance",
"onlyNew": false
}

Feed an AI agent

{
"keywords": ["the topic your agent is asking about"],
"sort": "date",
"onlyNew": false,
"maxAgeHours": 24
}

Input reference

FieldTypeDefaultWhat it does
keywordsarraySearch terms to monitor.
channelsarrayChannel handles or URLs to monitor.
sortstringdatedate (newest, for monitoring), relevance, views, rating.
onlyNewbooleantrueReturn only videos not seen in previous runs. 7-day memory per input set.
maxAgeHoursinteger0Skip videos older than this. 0 = no limit. Approximate — see below.
minViewsinteger0Skip videos below this view count.
maxResultsinteger0Videos per keyword / channel. 0 = first page only. Higher values page through YouTube.
includeShortsbooleantrueShorts are often more than half of a keyword's results. Turn off for long-form only.
filterLanguagesarray[]Keep only titles written in these languages. Undetermined titles are kept.
enrichVideosbooleanfalseOpen each video for its exact publish time, like count, full description and keywords. One extra request per video.
transcriptsbooleanfalseAdd the spoken transcript of each video.
transcriptLanguagesarray["en"]Preferred transcript languages, tried in order.
proxyConfigurationobjectApify residentialResidential recommended.
concurrencyinteger3How many keywords/channels to fetch at once.

Output

One dataset item per video. Export as JSON, CSV, Excel or XML, or pull it straight from the Apify API.

FieldTypeNotes
video_idstringYouTube video ID
urlstringDirect watch link
titlestring
channelstringChannel name
channel_urlstring or nullFilled for both keyword and channel runs
duration_textstring or nulle.g. 14:05. Blank for a live stream.
view_countinteger or nullParsed to a number
view_count_textstring or nullAs YouTube shows it, e.g. 486K views
published_textstring or nullAs YouTube shows it, e.g. 12 days ago
published_ts_approxinteger or nullApproximate Unix timestamp — see below
description_snippetstring or nullPresent for keyword search only — YouTube does not render descriptions on a channel's video grid
thumbnailstring or nullHighest-resolution thumbnail URL
is_shortbooleanWhether this is a YouTube Short
languagestring or nullDetected language of the title, ISO 639-1. null when it cannot be determined.
published_atstring or nullExact ISO 8601 publish time. Only with enrichVideos.
published_tsinteger or nullExact Unix timestamp. Only with enrichVideos.
like_countinteger or nullOnly with enrichVideos.
descriptionstring or nullFull description. Only with enrichVideos.
keywordsarrayVideo tags. Only with enrichVideos.
channel_idstring or nullOnly with enrichVideos.
subscriber_countinteger or nullThe channel's subscriber count, read from the video owner block. YouTube omits that block on some page variants, so this is null more often than the other fields — it is left empty rather than filled from a recommended channel. Only with enrichVideos.
channel_thumbnailstring or nullThe channel's avatar.
channel_usernamestring or nullThe channel's @handle.
comment_countinteger or nullExact count. Only with exactCommentCount.
comment_count_approxinteger or nullRounded — YouTube only shows 4.2K on the video page. Only with enrichVideos.
hashtagsarrayHashtags parsed from the description. Only with enrichVideos.
description_linksarrayLinks parsed from the description. Only with enrichVideos.
duration_secondsinteger or nullOnly with enrichVideos.
transcriptstring or nullFull spoken transcript. Only with transcripts.
transcript_statusstringWhy a transcript is missing: ok, disabled_by_uploader, no_transcript, video_unavailable, blocked, error.
transcript_segmentsarrayTranscript with start, duration and text per line. Only with transcripts.
transcript_languagestring or nullLanguage actually returned.
transcript_is_generatedbooleanWhether YouTube auto-generated it, as opposed to a human-written one.
_sourcestringsearch or channel
_querystringThe keyword or channel that produced this item
_modestringThe sort mode, or videos for channels

Sample record

{
"video_id": "IwZVXmQdX1E",
"url": "https://www.youtube.com/watch?v=IwZVXmQdX1E",
"title": "NASA Moon Base: The First Six Months",
"channel": "NASA",
"channel_url": "https://www.youtube.com/@NASA",
"duration_text": "14:05",
"view_count": 486000,
"view_count_text": "486K views",
"published_text": "12 days ago",
"published_ts_approx": 1757600000,
"thumbnail": "https://i.ytimg.com/vi/IwZVXmQdX1E/hq720.jpg",
"_source": "channel",
"_query": "NASA",
"_mode": "videos"
}

Turn it into a live monitor

  1. Run once with your keywords and check the output.
  2. Save it as a Task.
  3. Add a Schedule — every 15 minutes works well.
  4. Keep onlyNew on, so each run emits only videos you have not seen.
  5. Connect the dataset to Slack, Discord, a webhook, Google Sheets, Make or Zapier.

You now have a YouTube alerting feed that never repeats itself.

Use it from an AI agent

Callable from the Apify API and over MCP. Set onlyNew to false for agent calls so each question gets a full answer rather than a delta.


What to expect

About timestamps — read this one. A search or channel listing shows only relative text like 12 days ago, never an exact time. The video's own page does carry an exact timestamp, and enrichVideos fetches it — so if you need real timestamps, turn that on. This Actor gives you that text verbatim in published_text, and converts it to an approximate Unix timestamp in published_ts_approx. The field is named approx on purpose. It is accurate enough to answer "in the last 24 hours" and not accurate enough to sort videos uploaded minutes apart.

Shorts carry no publish time at all. YouTube's Shorts component does not include one, so published_text, published_ts_approx and duration_text are always null for a Short. Since videos without a timestamp are kept rather than dropped, maxAgeHours does not constrain Shorts — set includeShorts to false if you need the age filter to apply to everything you receive.

Without enrichVideos, maxAgeHours is therefore an approximate filter. Videos with no readable publish time are kept, not dropped — you should not lose a video because YouTube was vague about its age.

How many results per run. With maxResults at 0, a keyword search returns roughly 15 to 50 videos depending on how many Shorts YouTube mixes in, and a channel returns its latest ~30 uploads. Raise maxResults to go deeper. With onlyNew on, a scheduled run typically returns far fewer — which is the point.

Why a run can return few or zero items. In order of likelihood:

  1. onlyNew is on and nothing new has been uploaded. This is correct behaviour, not a failure.
  2. maxAgeHours or minViews filtered everything out.
  3. The keyword is genuinely quiet.
  4. The channel handle is wrong or the channel has no public uploads.

Public content only. Private, unlisted and members-only videos are not accessible.


FAQ

Do I need a YouTube Data API key? No. That is the main reason to use this. No Google Cloud project, no quota units, no daily limit to exhaust.

Do I need to log in or supply cookies? No. The Actor reads public pages only.

Can my Google account get banned? There is no account involved, so there is nothing to ban.

How is this different from a YouTube scraper? A scraper dumps everything every time. This one remembers what it already gave you and returns only new videos. That makes it cheap to run every 15 minutes, and it means you are not charged twice for the same video.

Am I charged for videos I already received? No. With onlyNew on, videos you have seen are filtered before they reach the dataset, so they are never charged.

My second run returned almost nothing. Is it broken? Almost certainly not — that is onlyNew working. Set it to false if you want the full list every time.

How far back does the memory go? 7 days per input set. Change the keywords or channels and it starts a fresh memory.

How many videos actually have a transcript? Across 172 videos from four keywords, about 60% did. The rest is not a failure on this Actor's side: uploaders can switch captions off, and most Shorts have them off. Every video carries a transcript_status saying which it was, so an empty transcript is never ambiguous. Turn includeShorts off and the share rises sharply.

Does it get transcripts? Yes — set transcripts to true. If a video has no transcript in your preferred languages, whatever transcript it does have is returned rather than nothing, and a human-written one is preferred over an auto-generated one where there is a choice.

Does it get comments? Not in this version.

Does it include Shorts? Yes, and they are flagged with is_short so you can split or drop them. For many keywords Shorts are more than half of what YouTube returns — a search for skincare came back with 38 Shorts and 8 long-form videos. Set includeShorts to false for long-form only.

Can I filter by date? Use maxAgeHours. Read the timestamp note in What to expect first — it is approximate by necessity.

Which proxy should I use? Residential, which is the default. YouTube serves a stripped page to flagged IPs rather than returning an error, so a clean IP matters.

Can I use my own proxies? Yes, through proxyConfiguration.


Changelog

  • 0.4.0 — Transcripts. Full text and timed segments, with a language fallback so a video is not skipped just because it has no English transcript.
  • 0.3.0enrichVideos adds the exact publish timestamp, subscriber count, rounded comment count, hashtags, description links, like count, full description, keywords and channel ID by opening each video. The note claiming YouTube never exposes an exact upload time was wrong and has been corrected.
  • 0.2.0 — Shorts are now returned and flagged with is_short (they were silently dropped before, which cost a keyword search most of its results). maxResults pages past the first page. Every video carries a detected language, and filterLanguages keeps only the languages you want.
  • 0.1.1 — Channel runs now return duration_text, and view counts and publish times survive YouTube's compact metadata layout (previously null on roughly half of all channel runs).
  • 0.1.0 — First release. Keyword and channel monitoring, cross-run dedupe, age and view filters.

Notes and limits

  • Reads public YouTube pages only.
  • By default a keyword search returns roughly the first page and a channel its latest uploads. Raise maxResults to page further — a channel's back catalogue keeps going for hundreds of videos.
  • YouTube changes its page structure regularly. This Actor parses several of YouTube's video components and is maintained against those changes. Run a small sample first, check the output, then scale up.
  • Timestamps are approximate. See What to expect.

Our other Actors

  • Threads Scraper — search Threads by keyword or pull a profile's posts, replies, reposts and media. No login, no cookies.
  • YouTube Transcript Scraper — the spoken transcript of any video, by URL, channel or keyword. Falls back to any available language instead of failing.

Disclaimer

This Actor collects only publicly available data. You are responsible for how you use the data you collect, including compliance with YouTube's terms of service, applicable data protection law such as GDPR, and any restrictions that apply in your jurisdiction. If you are unsure, take legal advice before scraping personal data at scale.


Keywords: youtube scraper, youtube monitor, youtube data api alternative, youtube without api key, no quota, youtube keyword alerts, youtube new video alerts, youtube channel scraper, youtube search scraper, extract youtube videos, export to csv, export to excel, json output, video monitoring, social listening, brand monitoring, youtube data extraction.