YouTube Live Status Scraper & Viewer Count Monitor avatar

YouTube Live Status Scraper & Viewer Count Monitor

Pricing

from $3.29 / 1,000 channel status row returneds

Go to Apify Store
YouTube Live Status Scraper & Viewer Count Monitor

YouTube Live Status Scraper & Viewer Count Monitor

Check whether YouTube channels are live right now: concurrent viewer count, live video URL, title, start time and every scheduled stream. Turn monitoring on and a run returns a channel only when it goes live, ends a stream or schedules a new one, for a small fee per channel checked.

Pricing

from $3.29 / 1,000 channel status row returneds

Rating

0.0

(0)

Developer

NeverEmpty

NeverEmpty

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

YouTube Live Status Scraper & Viewer Count Monitor - go-live alerts, priced per check

Check whether YouTube channels are live right now - concurrent viewer count, live video id and URL, title and start time - plus every scheduled stream with its start time. Give @handles, channel ids or channel URLs; no API key and no YouTube quota are needed.

With monitoring on, you receive a row only when something happens: a channel goes live, ends its stream, starts another stream, or schedules a new one. A poll on which nothing changed returns a single free no-change row.

In monitoring mode you pay a small fee per channel checked, $0.30 per 1,000 checks, and the normal row price only for the rows that report a change. Watching 20 channels every 5 minutes is 172,800 checks a month, which is $51.84 in check fees, plus the change rows you receive.

Best for

  • Go-live alerts - schedule a run every few minutes, send the dataset to Slack, Discord, Telegram or a webhook, and every row you receive is an event worth sending.
  • Upcoming-stream calendars - collect every scheduled stream of a list of channels with its start time in UTC, and get a scheduled row as soon as a new one appears.
  • Sponsored-stream verification - confirm that a paid creator actually went live, between which of your checks the stream ended, and the highest viewer count seen while you were watching.
  • 24/7 and multi-stream channels - channels that run several live streams at once (music, news, space agencies) list every one of them with its viewer count.
  • "Who is live now" lists - check a roster once with onlyLive and receive only the channels that are live.

What each row contains

  • What you asked for and what YouTube returned - inputChannel, channelId, channelHandle, channelName, channelUrl, channelMatchesInput.
  • Live status - isLive, liveVideoId, liveVideoUrl, title, viewerCount, viewerCountIsRounded, startedAt, startedAtPrecision, liveDurationSeconds, category, and liveSeenOnStreamsTab - whether the channel's Live tab also shows that stream with its LIVE badge, a second check of isLive from a different page.
  • Every live stream of the channel - liveStreamCount and liveStreams (video id, URL, title, viewer count, and whether that count is rounded).
  • Scheduled streams - hasScheduledStream, nextScheduledVideoId, nextScheduledVideoUrl, nextScheduledTitle, nextScheduledStartTime, scheduledStreamCount and scheduledStreams (video id, URL, title, start time in UTC, and how many people are waiting), earliest first. allStreamsListed says whether the channel's Live tab was read, so you know whether these lists are complete.
  • Monitoring - change, isFirstCheck, previousCheckedAt, previousIsLive, previousLiveVideoId, newLiveVideoIds, newScheduledVideoIds, and for a stream that ended: endedAfter, endedBefore, streamDurationSecondsAtLeast, streamDurationSecondsAtMost, peakViewerCountSeen, checksWhileLive.

Measured on 2026-10-19 from Apify: Lofi Girl was live with viewerCount 2350 on its main stream and 23 live streams in total; NASA had 2 live streams and 2 scheduled streams, and a NASASpaceflight stream was scheduled for 09:30 UTC.

Viewer count

viewerCount is the concurrent viewer count YouTube shows on the live video ("2,350 watching"), not the video's total view count. For the stream YouTube shows on the channel's /live page it is the exact number. For the other streams of a channel that runs several at once, YouTube lists them with a shortened number ("2.3K watching"); those come back as 2300 with viewerCountIsRounded: true, so you always know which numbers are exact. YouTube does not publish a stream's peak, so peakViewerCountSeen is the highest value your monitoring runs saw while the stream was live.

Start time

startedAtPrecision tells you how exact startedAt is:

startedAtPrecisionstartedAt looks likeWhere it comes from
second2026-10-19T14:11:05.000ZThe stream's own start time, when YouTube includes it in the page.
minute / hour2026-10-19T14:11:00.000ZYouTube shows only "Started streaming 19 minutes ago" (or "3 hours ago"); the time is counted back from when the page was read.
date2026-10-01YouTube shows only "Started streaming on Oct 1, 2026". This is the date as YouTube writes it; YouTube does not say which time zone it uses.
nullnullThe channel is not live, or no start was shown.

From Apify's servers YouTube often withholds the video player of a stream that is live right now and shows the rest of the page - title, channel, the exact concurrent viewer count and the start line above. The Actor reads that same page; it does not log in or retry around it. On those pages startedAt is a date or a relative time, so liveDurationSeconds is filled only when the precision is second, and a monitoring ended row gives the duration range only when the start was known to the second; otherwise those fields are null rather than a guess.

Scheduled start times

The start time of the next scheduled stream comes from the video's own page, to the second, whenever YouTube shows that stream on the channel's /live page and includes its start time there; if the page leaves it out, the time from the channel's Live tab is used. The other scheduled streams come from the channel's Live tab, which shows the time to the minute in US Pacific time; it is converted to UTC with daylight saving time applied. The two are checked against each other on every channel that has both, and if they differ by more than a minute, the Live-tab times of that channel are returned empty instead of wrong.

Monitoring, and what it costs

Turn monitoring mode on and the Actor remembers each channel's live streams and scheduled streams. On later runs a channel comes back only with one of these change values:

changeMeaning
first-checkThe channel had not been seen before. Every channel is returned once on the first run, to set the baseline.
went-liveNot live at the previous run, live now.
endedLive at the previous run, not live now. The row says the stream ended between endedAfter (the previous run) and endedBefore (this run), gives the duration as a range (streamDurationSecondsAtLeast to streamDurationSecondsAtMost) when the start was known to the second, and the highest viewer count seen by your runs while it was live.
new-streamLive at both runs, and a stream is live now that was not live at the previous run (a new stream replaced the old one, or a second one started). newLiveVideoIds lists them.
scheduledThe live status did not change, but a stream was scheduled that the previous run did not see. newScheduledVideoIds lists them.

A channel whose status did not change is not returned, so it costs no row price; the check fee for reading it still applies. A scheduled stream that disappears without going live is not reported as a change.

The duration of a stream is a range, not a single number, because the Actor only knows the status at the moments it runs. Run it more often for a narrower range.

The status is remembered per channel, not per list, so adding a channel does not reset the channels already being watched. In monitoring mode maxChannels does not cut changes: every change among the channels read is returned. If the run's maximum total charge stops a change from being delivered, that change is not remembered, so the channel still counts as changed the next time it is checked.

Do not put the same channel in two schedules that can run at the same time. Each run writes back only the channels it checked, merged into the statuses as they are at that moment, then reads them again and writes once more if another run overwrote them - so two overlapping runs over different channels keep each other's history. But Apify's key-value store has no atomic update, so this cannot be made watertight: runs that finish at the same instant, or check the same channel at the same time, can still overwrite each other's record, and the next run may return a first-check or a change a second time.

What monitoring costs

  • $0.30 per 1,000 channel checks - charged in monitoring mode for every channel whose status was read, whether or not it changed. Channels YouTube answers "not found" for and bot checks are not charged.
  • The row price - charged only for the rows returned, which in monitoring mode means first-check rows and changes.

The Actor reads only as many channels as the run's maximum total charge can pay for with both a check and a change row each, so a low limit cannot use up the budget on check fees and leave nothing for the rows. Channels beyond that are not checked; a budget-reached row says how many, and raising the maximum total charge lets them be checked. Runs with monitoring off are charged per row only.

Rows that are never charged

When there is nothing to return, this Actor says why instead of returning an empty result:

  • no-such-channel - YouTube answered "not found" for that handle or URL. A handle that does not exist gets this answer; whether a terminated channel gets the same answer has not been measured, so the row does not claim which.
  • blocked - YouTube answered with a bot check, a consent page, a rate limit or an empty response. The channel is not reported as offline. Requests go out directly first, and only this answer makes the run switch to a proxy session and try again.
  • unreadable - the page could not be read in the shape this Actor knows, or the channel's Live tab could not be read (a row without it could later report a stream as new when it is not).
  • other-channel - the live stream YouTube returned belongs to a different channel than the one asked for.
  • duplicate - the same channel was given twice in different forms (for example its @handle and its channel id); it is returned and charged once.
  • no-change - monitoring ran and no channel changed. The row lists the channels that are still live.
  • no-match - onlyLive is on and none of the channels is live right now.
  • invalid-input - the text is not a YouTube channel: a video link, a playlist, a search or another site. Nothing was requested for it.
  • budget-reached - the run's maximum charge was reached: the row says how many ready rows fit, or how many channels were not checked in monitoring mode.
  • not-checked - some channels were not checked or not returned, because maxChannels had already been reached (monitoring off), or because more than 1,000 channels were given. The row says how many.

How fast

Three channels are read at a time, with a short pause between groups. A channel that is not live takes one page; a live channel, or one with a stream scheduled, takes two (its /live page and its Live tab), or one with includeAllStreams off.

Input

FieldWhat it does
channelsThe channels to check: @handle, channel id (UC...), or a channel URL. @LofiGirl and @lofigirl are the same channel and are checked once. If empty, the example channels @LofiGirl and @NASA are checked.
maxChannelsHow many charged rows to return in total (up to 1,000).
onlyLiveReturn only the channels that are live right now.
includeAllStreamsAlso read the channel's Live tab, so every live stream and every scheduled stream is listed. On by default.
monitoringModeRemember the status and return a channel only when it changes.
resetMonitoringStateForget every remembered status and start a fresh baseline.
useProxyRetry through a proxy if YouTube answers with a bot check or a rate limit. Every request goes out directly first.

Questions

How do I get an alert when a YouTube channel goes live? Turn on monitoringMode, schedule the Actor, and send the run's dataset to your channel with an Apify integration or webhook. How often is a trade-off between how fast you hear about a stream and the check fee: 20 channels every 5 minutes is 172,800 checks a month ($51.84); every 15 minutes is 57,600 ($17.28). Rows with change: "went-live" are go-live events; ended rows tell you the stream is over; scheduled rows announce an upcoming stream.

How do I get the current viewer count of a YouTube live stream? Put the channel in channels and run the Actor. viewerCount is the number of people watching right now, and liveStreams gives the count for every stream if the channel runs several.

Does monitoring charge me when nothing changed? Unchanged channels are not returned and cost no row price. Each channel checked costs the check fee ($0.30 per 1,000), changed or not - that is what pays for polling.

Why is startedAt sometimes only a date? When YouTube shows a live stream's page without the video player, the page says only "Started streaming on Oct 1, 2026" or "Started streaming 19 minutes ago". The row returns exactly that much, with startedAtPrecision set to date, minute or hour, and leaves liveDurationSeconds empty instead of inventing a time of day. isLive and viewerCount are read the same way on both kinds of page.

Do I need a YouTube API key? No. The Actor reads the public channel pages, with no login, no API key and no daily quota.

Good to know

  • The data comes from YouTube's public channel pages (the /live page and the Live tab), read without a login. They are not YouTube's documented Data API, so YouTube can change them without notice; if a page changes shape, runs return free unreadable rows instead of guessing.
  • A stream that starts and ends entirely between two monitoring runs is not seen. Run more often if short streams matter to you.
  • Only the first page of a channel's Live tab is read - the part YouTube shows before you scroll. Live and scheduled streams appear there; very old ones do not matter for live status.
  • category is filled only for the stream shown on the channel's /live page, and only when YouTube includes the video player there; otherwise it is null.
  • startedAt is exact to the second only when startedAtPrecision is second. A date value is the date YouTube writes on the page, in a time zone YouTube does not state.
  • With includeAllStreams off, only the stream YouTube shows on the channel's /live page is known. In monitoring mode a channel running several streams at once can then be reported as new-stream when YouTube shows a different one of them.
  • The Actor reports status and counts. It does not record or download streams and does not read the chat.

Example input

{
"channels": ["@LofiGirl", "@NASA", "https://www.youtube.com/@NASASpaceflight"],
"monitoringMode": true,
"onlyLive": false,
"maxChannels": 100
}

Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

  • Missing a field, or need another filter? Tell us in the Issues tab. If the data is there, we add it.
  • Found a bug or a wrong value? Post the run ID in the Issues tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.