Overview / Blog / Telegram scrapers
Scraping  ·  28 Jul 2026  ·  9 min read

Two different tools are sold as a Telegram scraper

A Telegram scraper is two different products wearing one name: one reads what a public channel posted, the other reads who is inside a group. Only the second needs a logged-in account, and only the second can be stopped by a privacy flag you cannot see from outside. Which one you bought decides what lands in the export — and how much of that export you can ever act on.

Tutorial  ·  2 min 44 s  ·  shipping build

One scraping run end to end: sessions loaded and proxies assigned, a target group set, then every filter that decides which rows survive — recent activity, minimum messages per user, username present, bots and deleted accounts dropped. The console counts unique users found against users after filters, and the run ends on the spreadsheet.

Can a Telegram scraper bot pull a group's member list?

No, not a bot in the sense Telegram uses the word.

The Bot API offers three ways to look at membership and none of them is a list. getChatMember answers a question about one person whose ID you already hold. getChatMemberCount returns an integer. getChatAdministrators returns the admins. There is no method that enumerates a group, and the omission is not an oversight somebody clever routes around.

Telegram's own bot page settles the rest of it, stating plainly that bots can't start conversations with users and that a bot dropped into a group sees only relevant messages by default. So a product advertised as a telegram scraper bot that hands you a membership export is not running on a bot token. It holds a logged-in account and speaks MTProto, the protocol Telegram Desktop speaks, and the word bot is doing marketing work rather than technical work.

Which surface a tool runs on decides everything downstream: the errors that arrive, whose account absorbs them, and how much is at stake when a run goes wrong.

Why one phrase covers two different Telegram scrapers

Two things are sold under it, and they read completely different data.

The first reads content. A telegram channel scraper pulls what a public channel published — posts, timestamps, view counts, links to media — and because a public channel carries a web preview, a tool can read it without holding an account at all. Browser extensions and hosted crawlers serve that tier, as does Telegram Desktop's built-in chat export for one chat at a time, and as data jobs go it is fairly boring.

The second reads people. A telegram group scraper pulls who is inside a group: user IDs, usernames where they exist, whatever profile fields are visible. There is no logged-out route to that, because the request has to come from an account that is already a member, which is exactly why the second kind always asks you for a session and the first kind never does.

Look at what people actually type. What is telegram scraper, telegram scraper github, telegram scraper bot github, telethon telegram scraper, telegram scraper online, telegram scraper software — six queries with at least three different people behind them. One wants a definition, one wants a repository to clone, one wants a licence and somewhere to ask questions. Every result on the first page answers whichever of the three it was built for, which is why the search never quite lands.

A telegram scraper online, meaning anything that runs in a browser tab and never asks you to log in, obeys the same rule. It can read a public channel's posts. It cannot read a member list, because that list is not published to a logged-out visitor, and where an online tool does return members it is either driving your own logged-in web session or holding an account of its own.

What does a telegram group members scraper actually get?

Less than the column headers promise.

The export is a spreadsheet, one row per user, and in the July 2026 build it carries columns for user ID, group ID, message ID, username, first and last name, bio, gender, photo, a premium flag, last-seen status and time. Read down the phone column on a real run and it is almost entirely empty. Telegram surfaces a number only where the account holder's privacy setting allows it. The default does not. The API returns nothing where the setting says nothing, and that one column is the widest gap in this category between what gets advertised and what gets delivered.

Username is optional too. Plenty of accounts have never set one, and those rows carry an ID and an access hash instead, which stay valid only in the context that produced them. Last seen is a bucket rather than a clock: where an account hides its exact time, the API hands back a category — online, recently, last week, last month — and the export records the status string it was given rather than a date. Filtering on activity this month therefore means filtering on that bucket, which is a real signal and a coarser one than the column makes it look.

Everything above assumes you are already inside the group. The participants method returns CHANNEL_PRIVATE, documented as "You haven't joined this channel/supergroup", to an account that is not a member, and CHAT_ADMIN_REQUIRED for the filters reserved to admins. It also pages: Telegram's note on pagination puts the limit "typically between 1 and 100" per call, so a forty-thousand-member group is hundreds of sequential round trips and each one is a chance to collect a wait, which is what the Delay between targets field is for.

Member Scraper configuration in the panel, where a telegram group members scraper run gets its source and limits

When the member list is hidden, what is left to read?

The people who talk.

A supergroup can hide its participant list outright. The channel's full record carries a flag Telegram's documentation describes as "Whether the participant list is hidden", and when it is set there is nothing to enumerate while the member count keeps displaying as normal. This is what the repositories promising hidden members are really doing, and they are not defeating the flag. They read who spoke, because message senders stay visible when the roster does not.

It is a different data source and, for large channels, the more honest one. The module in the video takes a channel link, finds the discussion group Telegram attached to it, and scrapes the commenters instead of the membership — which also means the rows arrive pre-qualified, since somebody who posted last week is demonstrably a live account. Every filter on that screen exists to narrow the same trade: fewer rows, better rows.

Telethon script, GitHub repo or scraper software: what actually differs

Not the scraping code.

A telethon telegram scraper is genuinely short. Twenty lines resolve a group and iterate its participants, and against one account and one public group that really is the whole job. The cost shows up later, because MTProto is versioned and the layer moves, so a telegram scraper github project inherits its author's attention span and a repository that last built two years ago fails on a constructor that quietly changed shape. That is not an accusation aimed at anybody — it is what unmaintained free software is, in every language, and several of the more useful projects in this niche are archived rather than broken.

Approach What you supply What it can read Where it stops
A Telethon script One account and your own error handling Members and posts of groups that account joined The first wait you did not write code for
A GitHub scraper and adder Accounts, proxies, a Python environment Whatever the API layer it targeted still supports A layer change, with nobody maintaining it
An online scraper Nothing, or your logged-in browser session Public channel posts The member list, which is not public
Desktop scraper software Accounts and proxies, on your own machine Members, senders and content into one export The same Telegram limits as everything else

A telegram scraper software licence does not buy a better API call, since there is only one and everybody is making it. It buys the pool, the pacing and the export format. Whether that is worth paying for depends almost entirely on scale: one session against one public group, write the script and enjoy it; a hundred sessions, and the pacing engine is the product. You can see the shape of the argument in the screens from the shipping build, where the scraper configuration and the session manager are the same application looking at the same pool.

Why the adder breaks long before the scraper does

The list is the easy half.

Sold as a telegram scraper and adder, as a telegram member scraper and adder, or shortened to a telegram scraper adder, the pairing is always the same two jobs bolted together — and the second one carries nearly all of the failure. Adding is a separate method with a separate error surface, and its errors are not about speed. The invite documentation lists USER_PRIVACY_RESTRICTED, "The user's privacy settings do not allow you to do this", and USER_NOT_MUTUAL_CONTACT, "The provided user is not a mutual contact". No delay setting clears either one, because both are the recipient's decision rather than yours.

Alongside them sits USER_CHANNELS_TOO_MUCH, "One of the users you tried to add is already in too many channels/supergroups". Neither your fault nor something pacing repairs.

A ten-thousand-row export is not ten thousand additions, and nobody can tell you the addable share before the run.

So the number vendors quote is the wrong number. Export size is easy to sell and easy to hit. The figure that decides whether a run was worth doing is how many of those rows can be actioned at all, and it depends on settings nobody can read in advance. A hard ceiling sits above all of it: USERS_TOO_MUCH, "The maximum number of users has been exceeded". The figure circulating hardest in this niche is a wall around two hundred added members, after which a group grows only by people following a link themselves — Telegram's API pages publish no such number, though its own client library documents a version of it that applies to channels rather than groups, so treat whichever figure you were quoted as an observation that needs pinning down, and note that the ceiling Telegram does document sits at the far end, where supergroups support up to 200,000 members each.

Filtering is the part we can defend, and it runs before the adder rather than after. Only users with a username drops rows that cannot be messaged or added at all. Skip deleted accounts drops accounts that no longer exist, and Skip bots drops most of the remaining noise. Minimum messages per user set to two or more drops drive-by posters and keeps the regulars. Shrinking a list before anything touches it is cheaper than learning the same lesson one USER_PRIVACY_RESTRICTED at a time, and once the list is filtered, what actually sends the messages is a separate question with its own ladder of limits.

Where does a scraped list leave you, and what will this software not do?

In possession of other people's personal data, a position that comes with obligations attached.

A member export is personal data wherever that concept exists, and messaging the people in it is direct marketing under GDPR, CAN-SPAM and their local equivalents. You need a lawful basis before the first message goes out, and the software cannot supply one. Telegram's Terms of Service ask you to agree not to send spam or scam users, and that judgement lands on whoever picked the source and wrote the message.

The honest limits are short. Nothing here raises Telegram's ceilings, because they are enforced on Telegram's servers against every client and a panel is one more client. It cannot read a participant list a group has hidden, it cannot return a phone number Telegram has not disclosed, and it does not supply accounts or proxies.

On cost: the licence runs $120 a month, and the scraping modules are not sold apart from the rest. If a particular source needs checking before you decide anything, tell us what you want to scrape — the neighbouring modules get the same treatment across the rest of these write-ups.

Questions

Straight answers on scraping limits

Can I scrape a Telegram group without joining it?
Not the member list. Telegram's documentation for the participants method returns CHANNEL_PRIVATE, described as not having joined the channel or supergroup, when the request comes from an account that is not inside it. A public channel is a partial exception in one direction only: its posts carry a web preview, so a content scraper can read what was published with no account at all. The people are a different matter. Reading who is in a group means an account inside that group making the request, which is why every telegram group scraper asks you for a session and no post scraper does. If the target is private, joining is a prerequisite rather than a shortcut, and getting into an invite-only group you were not invited to is a separate problem that software does not solve for you.
Why is the phone number column almost always empty?
Because Telegram does not hand it over. A phone number is governed by the account holder's own privacy setting, the default does not expose it to strangers, and the API returns nothing where that setting says nothing. An export with a phone column will therefore show a number on a handful of rows and empty cells on the rest, and that is correct behaviour rather than a failed run. It is also the fastest way to judge a product page in this category: a sample export with a full phone column is a sample, not a result. If numbers are genuinely what you need, asking people for them is the honest route, and checking whether a number you already hold is registered on Telegram is a different job with a different module behind it.
What is the difference between a telegram channel scraper and a member scraper?
The data source, and it changes everything else. A telegram channel scraper reads content: posts, dates, view counts, attached media. For a public channel it can do that from the web preview with no account involved. A member scraper reads people, and there is no logged-out path to that at all. The confusion is expensive, because the two have almost nothing in common operationally. One needs a URL. The other needs an account that has joined the group, a proxy for that account, and pacing that survives several hundred paged requests without collecting a wait. Buyers who wanted post content routinely pay for the second, and buyers who wanted an audience routinely try the first. Read the output columns on any tool before you read its price.
How many members can one scraping run return?
As many as the group exposes, which is not the same number as its member count. Requests are paged, and Telegram's own pagination note puts the per-call limit typically between 1 and 100, so a large group means hundreds of sequential calls and each one is a chance to collect a wait. Two things cap the total independently of patience. A supergroup can hide its participant list, and when that flag is set there is nothing to enumerate at any speed. Very large groups also tend to stop yielding new rows well before the displayed count is reached. We set a target number per run instead of promising a total, because the total is a property of the group rather than of the software reading it.
Does a telegram scraper and adder actually add everyone on the list?
No, and the gap is usually wide. Adding is a separate API method with its own error surface, and the two errors that matter most are the recipient's decision rather than yours. The invite documentation lists USER_PRIVACY_RESTRICTED for privacy settings that forbid it and USER_NOT_MUTUAL_CONTACT for people who are not mutual contacts. Neither of those clears with a longer delay, because neither is about speed. Above them sits USER_CHANNELS_TOO_MUCH, for people already in too many groups and channels. So the addable share of any scraped list is decided by settings you cannot read in advance, and a vendor quoting you a conversion figure for it is quoting themselves. Filter first, add slowly, and judge the run on rows accepted rather than rows exported.
Is scraping Telegram members against the Terms of Service?
Scraping is not named in the Terms of Service. What people do next usually is. The agreement asks users to agree not to send spam or scam users, and Telegram's API credentials page says that using the API for flooding or spamming gets the account banned forever. The boundary is not the export, then. It is whether the people inside it have any reason to expect a message from you. There is a second layer that has nothing to do with Telegram at all: a member list is personal data, so messaging it is direct marketing under GDPR, CAN-SPAM and their local equivalents, and you need a lawful basis before the first message leaves. The software cannot supply one, and we would rather say that here than leave it unmentioned.

Scraping and messaging share one session pool

Member Scraper, Group Content Scraper and the activity scraper in the video run on the same accounts, the same per-session proxies and the same live log as everything else in the suite. One licence at $120 a month covers all of it, and the exports stay on your machine.