
You want a live stream that shows your YouTube subscriber count and keeps running day and night: a "road to 10K" screen, a milestone countdown, or a stats wall for your channel. Three pieces make it work: the number YouTube actually gives out, a small web page that shows it inside OBS, and a machine that stays on. Each piece has a catch that is easy to miss, and YouTube has rules that matter more for a stream that is mostly one number. This guide covers all of it, checked against YouTube's and OBS's own documentation on 8 November 2026.
Quick answer: A YouTube live sub count stream is a web page that reads statistics.subscriberCount from the YouTube Data API, added to OBS as a Browser Source and streamed from a computer that stays on. Expect steps, not single ticks: YouTube says the value "is rounded down to three significant figures" for channels above 1,000 subscribers, even when the channel owner asks for it, so 12,345 shows as 12,300. One channels.list call costs 1 quota unit out of the default 10,000 a day, so updating once a minute uses 1,440. Keep the page small, reload it every few hours, and give the stream more than a bare number if the channel is monetized.
How YouTube exposes the subscriber count
The number comes from the channels resource of the YouTube Data API v3. Its statistics part has three fields you need:
| Field | What YouTube's reference says |
|---|---|
subscriberCount | "The number of subscribers that the channel has. This value is rounded down to three significant figures." |
hiddenSubscriberCount | "Indicates whether the channel's subscriber count is publicly visible." |
viewCount, videoCount | Total views and the number of public videos, if you want a second line on screen |
The rule dates from 10 September 2019. YouTube's revision history says counts "are rounded down to three significant figures for subscriber counts greater than 1000 subscribers", and adds: "This change affects this property value even in cases where a user sends an authorized request for data about their own channel. Channel owners can still see exact subscriber counts in YouTube Studio."
In practice:
| Real count | API returns | YouTube shows publicly | Count moves in steps of |
|---|---|---|---|
| 123 | 123 | 123 | 1 subscriber |
| 1,234 | 1230 | 1.23K | 10 subscribers |
| 12,345 | 12300 | 12.3K | 100 subscribers |
| 123,456 | 123000 | 123K | 1,000 subscribers |
| 1,234,567 | 1230000 | 1.23M | 10,000 subscribers |
The rows are YouTube's own examples from the API revision history and from YouTube Help's page about checking your subscriber count, which also lists the step sizes. YouTube's fake engagement policy adds that subscriber numbers shown by "Third-party sites and apps using the YouTube Data API" update in real time. So the API is current, just rounded.
Two consequences for your stream. First, below 1,000 subscribers you get the exact number, so a small channel's counter moves with every subscriber. Above that, your counter sits still until the rounded value changes. Second, do not try to fill in the gap. YouTube's Developer Policies say API clients must not "replace API Data with similar, independently calculated data". If you see a large channel's counter climbing one by one somewhere, that number is not the Data API's subscriberCount. Your exact figure is in YouTube Studio: Analytics, the Overview tab, the Realtime card, "SEE LIVE COUNT". That view is for you, not for a public overlay.
What you need before you build
- A Google Cloud project with the YouTube Data API v3 enabled, and an API key. Google's guide says a request without an OAuth token "must send an API key" and to use a key "for requests that only retrieve public data", which a subscriber count is.
- A restricted key. Google's API key documentation recommends "setting both API restrictions and application restrictions". Under API restrictions, allow only the YouTube Data API v3. Under application restrictions, pick IP addresses, which Google describes as for "Applications called by specific servers", and enter the public IP address of the computer that will run OBS (Google accepts IPv4 and IPv6 addresses, so add both if that machine has both).
- Your channel ID. Look it up once with your handle;
forHandleaccepts the handle with or without the @:
curl "https://www.googleapis.com/youtube/v3/channels?part=id,statistics&forHandle=@YourHandle&key=YOUR_API_KEY"
Copy the id from the reply and use it from now on.
Quota. YouTube gives every project "10,000 units per day combined for all other endpoints" (search and uploads have their own buckets), and channels.list costs 1 unit. Daily quotas reset at midnight Pacific Time, and invalid requests cost at least one unit too. One call a minute is 1,440 units a day; one every 10 seconds is 8,640. Because the number only changes in rounded steps, once a minute is plenty.
Build the live sub count page
Save this as subcount.html in a folder on the computer that runs OBS. Put in your key and channel ID.
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
body { margin: 0; font-family: Arial, sans-serif; color: #ffffff; }
#wrap { width: 1280px; height: 720px; display: flex; flex-direction: column;
align-items: center; justify-content: center; }
#name { font-size: 48px; opacity: 0.85; }
#count { font-size: 180px; font-weight: 800; font-variant-numeric: tabular-nums; }
#note { font-size: 28px; opacity: 0.7; }
</style>
</head>
<body>
<div id="wrap">
<div id="name">Loading</div>
<div id="count">...</div>
<div id="note"></div>
</div>
<script>
const API_KEY = "YOUR_API_KEY";
const CHANNEL_ID = "UCxxxxxxxxxxxxxxxxxxxxxx";
const EVERY_MS = 60000; // one call a minute: 1,440 units a day
const RELOAD_MS = 6 * 60 * 60 * 1000; // fresh page every 6 hours
const fmt = new Intl.NumberFormat("en-US");
async function update() {
const url = "https://www.googleapis.com/youtube/v3/channels" +
"?part=snippet,statistics&id=" + CHANNEL_ID + "&key=" + API_KEY;
try {
const res = await fetch(url, { cache: "no-store" });
const data = await res.json();
if (!res.ok) throw new Error(data.error ? data.error.message : res.status);
const ch = data.items && data.items[0];
if (!ch) throw new Error("channel not found");
document.getElementById("name").textContent = ch.snippet.title;
if (ch.statistics.hiddenSubscriberCount) {
document.getElementById("count").textContent = "hidden";
document.getElementById("note").textContent = "";
return;
}
const n = Number(ch.statistics.subscriberCount);
document.getElementById("count").textContent = fmt.format(n);
document.getElementById("note").textContent =
n >= 1000 ? "subscribers, rounded by YouTube" : "subscribers";
} catch (e) {
document.getElementById("note").textContent = "Update failed, retrying";
}
}
update();
setInterval(update, EVERY_MS);
setTimeout(() => location.reload(), RELOAD_MS);
</script>
</body>
</html>
What it does: one request a minute, it only swaps the text of three elements, and a failed request leaves the last good number on screen. The "rounded by YouTube" line tells viewers why a big channel's number moves in steps, which keeps the stream honest. If you prefer YouTube's own short style (12.3K), use new Intl.NumberFormat("en-US", { notation: "compact", maximumSignificantDigits: 3 }) instead.
Add it to OBS as a Browser Source
In OBS, click + under Sources and choose Browser. These are the properties as OBS names them:
| Property | Set it to | Why |
|---|---|---|
| Local file | On, then pick subcount.html | OBS loads local files through its own handler, so the page can call the API |
| Width / Height | 1280 / 720 | Match the page and your canvas (OBS defaults to 800 by 600) |
| Use custom frame rate | On, FPS 10 | A number that changes once a minute does not need 30 renders a second. The range is 1 to 60; with it off, the page renders in step with OBS |
| Custom CSS | Leave the default | It makes the page background transparent, so put a background image or colour source below it |
| Shutdown source when not visible | On if you switch scenes | Unloads the page when it is not in the active scene |
| Page permissions | No access to OBS | A counter never needs to control OBS |
The "Refresh cache of current page" button reloads the page right away, handy after you edit the file.
Keep the counter running for days
OBS describes the Browser source as "quite literally, a web browser", based on the Chrome Embedded Framework, and pages that keep adding things to themselves grow in memory over the hours. The page above only replaces text, and the location.reload() every six hours starts it fresh anyway. If you add animated backgrounds or third-party widgets, read our guide to the OBS browser source memory leak before you leave it running for a week.
The rest of a long run:
- Reconnects. Keep Automatically Reconnect enabled in OBS (Settings, Advanced) so a dropped connection to YouTube comes back by itself. Our OBS auto reconnect guide covers the retry limits and what to do when they run out.
- Quota errors. If the note line says the update failed, check the Quotas page of your Cloud project. With one call a minute you are far below the limit, unless the same key also serves something else.
- Archives. YouTube can archive a stream automatically when it is under 12 hours, and warns: "If your stream exceeds 12 hours, it may not be captured at all." A 24/7 counter may leave no replay. See how long a YouTube live stream can be if you need recordings.
For the stream output, YouTube's encoder page lists RTMP or RTMPS, a keyframe every 2 seconds ("Do not exceed 4 seconds"), constant bitrate, AAC or MP3 audio, and for 720p at 30 fps with H.264 a minimum of 3 Mbps and a recommended 8 Mbps. A screen of mostly still text is the easy case for the encoder, so you can start near the minimum.
YouTube rules that matter for an always-on counter
We found no YouTube rule against a counter stream as such, but four policies decide if it earns money and if your channel keeps live streaming.
Monetization: generic or repetitive content. On 15 July 2025 YouTube renamed its "repetitious content" policy to "inauthentic content" and said it covers "content that is repetitive or mass-produced". On 8 November 2026 the same help page headed this section "Generic or Repetitive Content" and lists as not allowed to monetize: "Image slideshows, templated storylines, or scrolling text with minimal or no narrative, commentary, or educational value." The page says its use of the word video "refers to Shorts, long-form videos, and live streaming". A bare number on a black screen is close to that description. If the channel is in the Partner Program, give the stream a reason to watch: a milestone event you host, live chat you answer, goal progress, or segments that change. Our post on the generic and repetitive content policy for 24/7 streams goes deeper.
Fake engagement. YouTube does not allow "content that solely exists to incentivize viewers for engagement", or "Offering to subscribe to another creator's channel only if they subscribe to your channel ('sub4sub')". It also says: "You're allowed to encourage viewers to subscribe". The policy covers live streams and comments, so moderate live chat; counter streams attract sub4sub messages.
Impersonation. If you stream someone else's count, the impersonation policy forbids copying another channel's "profile pictures, banners, or specific color schemes", and one of its examples is "Pretending to be a backup channel by adding words like 'Backup,' 'Shorts,' or 'Live' to a creator's name." Fan channels must say so "explicitly in your channel name or handle".
Live streaming restrictions. A Community Guidelines strike or a removed stream can turn off live streaming, and YouTube adds: "If your account has been restricted from live streaming, you're prohibited from using another channel to live stream on YouTube." Copyright counts as well: an active stream that gets a copyright strike, or that matches another copyrighted live broadcast, is on the same list. Use music you have the rights to; our royalty free music guide shows how to keep proof.
Run it on a streaming VPS
A counter that runs for weeks should not depend on your desktop. Closing the lid, a system update or a power cut ends the stream, and your PC draws power the whole time. Our streaming VPS plans keep OBS streaming when your own PC is off; you open the desktop in your web browser, and the server has a 1 Gbps uplink. For this scene, Gold is listed for 720p at 30 fps, which matches the settings above. Stone is listed for 480p at 1 fps and meant for simple content and testing, so use it to try the page, not for the public stream. Restrict your API key to that server's public IP address.
Counting Instagram instead of YouTube? See our guides to an Instagram follower count stream, an Instagram video counter stream and Instagram stats in OBS.
FAQ
Why does my live sub count only move in steps of 10 or 100?
Because the YouTube Data API rounds subscriberCount down to three significant figures above 1,000 subscribers. At 1,234 it returns 1230 and only shows 1240 once the channel reaches 1,240; at 12,345 it returns 12300 until the channel reaches 12,400. Below 1,000 it is exact.
Can I show my exact YouTube subscriber count on stream?
Not through the Data API. YouTube says the rounding applies "even in cases where a user sends an authorized request for data about their own channel". Only YouTube Studio shows the exact number, on the Realtime card in Analytics. The Developer Policies also forbid replacing API data with numbers you calculate yourself.
Is a 24/7 YouTube subscriber count stream allowed?
We found no rule against one; like any stream it has to follow the Community Guidelines. Monetization is the harder part: YouTube's channel monetization policies list "scrolling text with minimal or no narrative, commentary, or educational value" as not allowed to monetize, and that applies to live streams. Add something worth watching, and keep sub4sub out of the chat.
How often should a YouTube sub count overlay refresh?
Once a minute is enough. A channels.list call costs 1 unit and a project gets 10,000 units a day by default, so a 60 second refresh uses 1,440 units. Faster polling only burns quota, because the rounded number changes rarely.
Can one stream show several channels' subscriber counts?
Yes. The id parameter takes "a comma-separated list" of channel IDs, so one call returns all of them for 1 quota unit; in the page above, loop over data.items instead of reading items[0]. Check hiddenSubscriberCount for each channel, because some channels do not show their count publicly.
Sources
All opened on 8 November 2026:
- YouTube Data API: Channels resource, Channels: list, Revision history, 10 September 2019, Overview (quota), Quota calculator, Implement authorization (API keys), Developer Policies
- Google Cloud: Manage API keys
- YouTube Help: Check your YouTube subscriber count, Fake engagement policy, Impersonation policy, YouTube channel monetization policies, Avoid restrictions on YouTube live streaming, Archive live streams, Choose live encoder settings, bitrates, and resolutions
- OBS: Browser Source (knowledge base), obs-browser source code: obs-browser-plugin.cpp, obs-browser-source.cpp, en-US.ini; OBS Studio 33.0.1 en-US.ini