⎯ TL;DR
  • Telegram has a public web preview at t.me/s/<channel>. No auth needed. Indexed by Google.
  • Through official MTProto API (authenticated), you can retrieve members of discussion groups, comment authors, and users who reacted to messages.
  • Snowball crawl: start from known channels → collect @mentions in messages → recursively expand the graph.
  • Filters: last_online (recent / week / month), Premium badge, language, photo presence. Geography is not available.
  • Realistic throughput: 50-200 channels/hour per user session, respecting flood limits.

"Audience scraping" in Telegram covers two distinct processes, often conflated. First — indexing channels and groups as entities (name, description, subscriber count, category). Second — extracting individual users from those channels (username, ID, online status, premium flag).

The first is entirely public: any channel with a "public link" is viewable without auth via web preview t.me/s/<channel_name>. Google indexes this page.

The second is harder. Channel subscriber lists via official API are admin-only. But discussion group members (the comments group linked to the channel) are accessible to any authenticated user. This mechanism underlies most of the industry's mass-parsing.

01 · Public endpoints

What you can actually access publicly

Several Telegram endpoints respond without authentication:

# Public web preview (HTML + OpenGraph meta) GET https://t.me/s/channel_name ↳ returns HTML with ~20 latest messages, subscriber count, pinned # Single message static preview GET https://t.me/channel_name/12345?embed=1 ↳ iframe-ready page for one message + author

From parsing t.me/s/ you get:

02 · Snowball crawl

How we indexed 4.8M+ channels

Our index contains 4.8M+ channels and groups. Not purchased, not "leaked from a secret source" — it's the result of months-long snowball crawl over public t.me/s. Here's how it works:

def snowball_crawl(seed_channels, max_depth=3): visited = set() queue = deque(seed_channels) while queue: ch = queue.popleft() if ch in visited: continue visited.add(ch) html = fetch(f"https://t.me/s/{ch}") meta = extract_meta(html) mentions = extract_mentions(html) db.save(ch, meta) for m in mentions: if m not in visited: queue.append(m)

One channel typically mentions 5-15 others (collaborations, forwards, recommendations). With branching factor ~10, the graph grows exponentially: start with 100 seeds, 3 days in you have 100K, 2 weeks in — 2M.

03 · User extraction

Getting actual users from a channel

For the second part — extracting specific users — you need an authenticated MTProto client. Work with Telethon, Pyrogram, or TDLib.

SourceAccessWhat you get
Discussion groupAny logged-in user if publicID, username, name, Premium, last_seen, bio
Comment authorsPublic (visible in web preview)Username, name
Reacted users (GetMessageReactionsList)AuthenticatedID, username, reaction, timestamp
Story viewersOnly the story author— (not external)
Channel subscribersAdmin-only— (not external)

Since 2024 Telegram tightened access: channels.GetParticipants for non-admins returns only first ~200 participants — this is why "scrape all subscribers of a public channel" no longer works as in 2022.

But channels.GetParticipants for the linked discussion group (if public) still returns the full list — the loophole the industry uses.

«A channel with 10,000 active discussion commenters is the best niche lead database you can find. Real engaged users.»
04 · Filters

How to segment warm audience

Raw 10,000 users is material. The real value is in filtered segments. Telegram returns several useful flags:

  1. last_seen — Telegram returns rough ranges: online, recently (within 2-3 days), last_week, last_month, long_ago. For outreach you need online + recently.
  2. Premium flag — significantly higher engagement. Conversion on Premium users is typically 3-5× higher.
  3. Photo — users with avatars are more "real". Without photo — often bots or read-only accounts.
  4. Bio keyword match — filter by keywords in profiles. Works for 30-50% of users who filled bio.

Not available: geographic filter by country, phone number, email, biometric data. Telegram doesn't expose these to non-admins. Any service promising "filter by city X" either lies or uses indirect signals (lang_code, niche channels) with ~60% accuracy.

05 · Legal

Legality and ethics

Telegram's ToS prohibits "automated scraping" at scale without permission. That said, scraping public information (what any authenticated user can see) is legally permissible in most jurisdictions, as long as it doesn't violate GDPR / privacy laws.

Grey zones:

TG:ON doesn't sell databases. We give you a tool to parse your audience. What you do with it is your responsibility. We're "tool-neutral" — same applies to a hammer or Excel.

⎯ download

TG:ON for macOS · Windows · Linux

Desktop app, 160 MB. Runs locally, your keys stay yours. 3-day trial, no credit card.

Download for free
⎯ try it

4.8M+ index · 3-day trial.
No credit card.

Pro tier: parsing, filters, exports, daily index updates. One-click cancel if not useful.

Start trial