Five platforms print the follower count in the head of the page, before any script runs. Instagram puts it in the meta description: "104M Followers, 93 Following, 4,935 Posts". Facebook puts it in og:description: 28,729,210 followers. LinkedIn puts it in the meta description: 7,122,889 followers. YouTube puts 15,100,000 subscribers in ProfilePage JSON-LD, and Twitch puts 2,461,147 followers in the JSON-LD of a channel page. One plain HTTP fetch through a residential exit reads each of them. Rendering the same URL adds up to 2.7 times the bytes and no number. TikTok is the exception, and for it the tiktok_profile collector returns 2 profiles in 14.4 seconds.
The search results sell a browser for a number that is already in the head
Search for an Instagram follower count scraper and every result on the first page is a tool: a hosted actor priced per thousand profiles, a browser-automation vendor, a video walkthrough, two exporters that borrow your own session, a listicle of ten scrapers. The one human voice is a Reddit thread from someone with a CSV of profile URLs who was told to buy rotating proxies and "run this", and could not make any of it work.
None of those pages says the thing that makes the job small. The follower count on a public Instagram profile is the first line of the meta description, server-rendered for link previews, and it arrives in the first kilobytes of a plain HTTP response. Meta's own webmaster guide is explicit that Open Graph tags exist so the crawler does not have to guess the title and description, and the same mechanism is why a follower-tracking job needs no browser on five of the six platforms people ask about.
Eleven targets, and where the number lives
Every row is a public profile, Page, channel or listing fetched logged out through a residential exit, twice: as a plain HTTP client and rendered. The word counts are extractable body text, which is why they are tiny on the platforms whose page is an application shell. The number was read from the plain response.
| Target | Exit | Plain HTTP words | Rendered words | Where the number is | Setting |
|---|---|---|---|---|---|
| Instagram profile | US | 40 | 40 | meta description: 104M Followers, 93 Following, 4,935 Posts | plain HTTP, 842,611 bytes |
| Facebook Page | US | 0 | 350 | og:description: 28,729,210 followers, 128,489 talking about this | plain HTTP, 923,794 bytes |
| LinkedIn company page | US | 1,928 | 2,588 | meta description: 7,122,889 followers; Organization JSON-LD | plain HTTP, 373,575 bytes |
| YouTube channel | US | 15 | 585 | ProfilePage JSON-LD: 15,100,000 subscribers; canonical resolves the handle to the channel ID | plain HTTP, 1,746,955 bytes |
| Twitch channel page | US | 0 (home) | 125 | ProfilePage JSON-LD: 2,461,147 followers, ten videos with view counts | plain HTTP, 214,029 bytes |
| Zillow listing | US | 759 (home) | 0 | meta description: price, beds, baths, square feet | plain HTTP, 755,913 bytes |
| Reddit subreddit listing | US | 574 | 0 | server-rendered HTML: scores and comment counts per post | plain HTTP, 566,030 bytes |
| Roblox game | US | 0 (home) | 128 | public games endpoint: 226,518 live players in 1,802 bytes | plain HTTP to the endpoint |
| TikTok profile | US | 5 | 12 | nothing in the head; oEmbed answers in 668 bytes without a count | tiktok_profile collector, 2 rows in 14.4 s |
| Spotify artist | US | 0 | 14 | nothing in the head; followers.total in the Web API | the Web API with a client token |
| Trustpilot company | US | 19 | 3,588 | meta description: 301,632 reviews, written after the page renders | rendered, or the reviews collector, 10 rows in 14.8 s |
The first five rows are the post. On Instagram the plain fetch and the render return the same 40 words, because the profile grid is loaded by scripts and the browser does not print it as text either; re-audited today the render returned 97 words and the identical description. On LinkedIn the rendered page has more words but the count was in the head before any of them. On YouTube the head does something the rendered page never does for you: it resolves @NASA to the channel ID UCLA_DiR1FfKNvjuUpBHmylQ in the canonical, which is the key every later call needs.
One fetch per profile, and what a gigabyte buys
The cost of a follower count is the size of the head-carrying response, and only that. Counting a gigabyte as 10^9 bytes on residential Basic at $0.80/GB:
| Platform | Plain bytes | Rendered bytes | Plain cost per profile | Rendered cost per profile | Profiles per GB, plain |
|---|---|---|---|---|---|
| 842,611 | n/a | $0.00067 | n/a | 1,187 | |
| 923,794 | 2,474,309 | $0.00074 | $0.00198 | 1,082 | |
| 373,575 | 825,521 | $0.00030 | $0.00066 | 2,677 | |
| YouTube | 1,746,955 | 3,544,622 | $0.00140 | $0.00284 | 572 |
| Twitch channel page | 214,029 | 1,718,470 (home) | $0.00017 | $0.00137 | 4,672 |
Instagram's plain fetch took 2.06 seconds today; the two-pass audit with the render took 25.2 seconds. Facebook's rendered Page costs 2.7 times the bytes of the plain one and still hands you the same count. The largest saving is not the bandwidth, it is the browser minutes: a thousand profiles rendered is hours of browser time for a field that a thousand plain fetches return in minutes. On Twitch the plain channel page is also the cheapest object in this table, 214,029 bytes for the follower count and ten videos with views.
The exit country rewrites the number, not just the label
This is the part the tools do not warn you about, and it breaks trackers quietly. The head is localised on the exit IP alone, with no Accept-Language sent. The same Instagram profile returned "104M Followers, 95 Following, 4,925 Posts" from the United States and "104M Follower, 95 Gefolgt, 4,925 Beitraege" from Germany, "104M seguidores" from Brazil with an em dash where the English uses a hyphen, and a fourth ordering from Japan. Facebook returned "28,729,210 followers" to a US exit and "28.729.208 Follower" to a German one. LinkedIn returned "7,122,889 followers" and "7.122.892 Follower:innen".
A regex written for the English label finds nothing in German, and nothing is not the same as zero followers. Worse, a numeric parser that strips commas reads 28.729.208 as 28. Two rules cover every platform in the table: pin the exit country per job, and strip every separator before converting, never matching on a translated label. YouTube adds a third: from a German exit the channel URL does not reach the channel at all but a 212-word consent page with no ID and no count, so the exit for YouTube is country=us, always.
TikTok and Spotify are the exceptions, and the count lives in the collector or the API
TikTok's head is empty. A profile fetched from four countries returned roughly 400 kilobytes of application shell each time with no canonical, no Open Graph and no JSON-LD, and its oEmbed endpoint answers a plain client in 668 bytes with the display name and no follower count. For TikTok the setting is the tiktok_profile collector: today it returned 2 profiles in 14.4 seconds at $0.004 per profile, NASA with 1,900,000 followers, 9,700,000 likes and 49 posts, National Geographic with 9,600,000 followers, from a US exit, no login, no browser.
Spotify's artist page over plain HTTP has a canonical and nothing else, no description and no structured data, and the rendered page returns 14 words. The count is followers.total in the Web API under a client-credentials token, which needs no proxy at all. Trustpilot is the third shape: the review count, "301,632 people have written so far", is in the description, but the description is written by the page after it renders, so the choice there is a rendered fetch with a six-second wait or the reviews collector, 10 reviews in 14.8 seconds.
For the platforms whose head carries the count, the collectors return the count plus the fields around it: youtube_channel returned 30 videos for @NASA in 3.84 seconds with the subscriber and video totals on every row, and linkedin_company returned the parsed company row in 4.3 seconds with 7,122,884 followers and the employee count. An Instagram profile collector exists for the same reason: one row with the counts typed, when a regex over a meta description is not what you want to maintain.
Read the robots file first, and read the page logged out
Instagram's robots.txt is 6,184 bytes. It opens with a notice that automated collection is prohibited without written permission, lists 14 crawlers that are disallowed everywhere, gives named search engines path exclusions, and ends with User-agent: * and Disallow: /, followed by four sitemaps, one of them a profile sitemap. Facebook's file says the same in 50,087 bytes. The profile page itself carries noarchive, noimageindex in its robots meta and no JSON-LD.
So be accurate about what a plain fetch is. It reads what the platform serves to any anonymous visitor, and for these five platforms that includes the count. Meta's terms say automated collection needs its written permission; LinkedIn's robots file disallows everything to an unnamed client. A public surface being readable is a technical fact and permission is a contractual one. Where a platform's terms forbid something, we say so in one line: none of the settings in this post logs in, follows anyone, sends anything or touches an account. Follower counts are for creator research, brand monitoring and ad verification, and personal data attached to a profile is your lawful-basis problem, not the proxy's.
The setting that works on the five platforms
- Network: residential proxies, Basic line at $0.80/GB. Every head in the table answered a residential exit on the first request; nothing here rewarded Premium at $2.20/GB, mobile at $2.30/GB or ISP at $2.50 per IP per month.
- Fetch mode:
engine: tls, plain HTTP, no rendering. Instagram 40 words with the count in the description, LinkedIn 1,928 words with the count in the description, YouTube 15 words with 15,100,000 subscribers in JSON-LD; rendering costs 2.7 times the bytes on Facebook and 2.0 times on YouTube for the same number. - Country to pin:
country=usfor English labels and US number format. A German exit returns "28.729.208 Follower" on Facebook and "7.122.892 Follower:innen" on LinkedIn, and on YouTube a 212-word consent page instead of the channel. - When the proxy is not enough: the tiktok_profile collector, 2 profiles in 14.4 seconds at $0.004 each; youtube_channel, 30 videos in 3.84 seconds; linkedin_company, one row in 4.3 seconds; for the head as Markdown with the description intact, the web scraping API at $0.0002 per page, rendering off.
- Free tier: every account gets $2 of free API usage per month, which is about 2,900 Instagram profile heads at today's 842,611 bytes, or 500 TikTok profiles through the collector, before anything is billed.
Sources & further reading
- instagram.com/robots.txt (fetched 28 September 2026, 6,184 bytes)
- A Guide to Sharing for Webmasters: Open Graph markup, Meta for Developers (updated 30 June 2026)
- Profile page (ProfilePage) structured data, Google Search Central
- Scrape insta follower count without logging in using *.csv url list, r/webscraping