
Instagram Reel Scraper
scrape.ly/store/echofield/instagram-reel-scraperSocial mediaVideos
1 monthly user

Look up Telegram usernames, @handles and t.me links in bulk: type (user, bot, channel, group), name, bio, subscriber or member count, verified flag, photo and whether the name exists.
Turn a list of Telegram usernames, @handles or t.me links into clean profile rows: type (user, bot, channel or group), name, bio, subscriber or member count, verified badge, photo link, and whether the name exists at all. It reads only the public t.me pages, so there is no Telegram account, phone number or API key, and a thousand names take about a minute.
t.me/<name>. Nothing to authorize and nothing that can get an account banned.telegram, @telegram, https://t.me/telegram, t.me/s/telegram, telegram.me/telegram and tg://resolve?domain=telegram all collapse into one row.status of success or not_found, so you can clean a list of dead or mistyped handles.| Field | What it does |
|---|---|
telegram_url | Usernames, @handles or t.me links. Duplicates are removed. |
listUrl | Optional public link to a text or CSV file with one name per line, for long lists. |
maxResults | Stop after this many profile rows. Default 1000, 0 means no limit. |
entityTypes | Keep only user, bot, channel or group. |
skipNotFound | Do not save (or charge) names that do not exist. |
verifiedOnly | Keep only accounts with the verified badge. |
minMembers, maxMembers | Keep channels and groups in this size range. |
proxyConfiguration | Datacenter proxy by default. |
{
"telegram_url": ["telegram", "@BotFather", "https://t.me/TelegramTips"],
"maxResults": 1000,
"entityTypes": ["channel", "bot"],
"proxyConfiguration": { "useScrapelyProxy": true, "scrapelyProxyGroups": ["DATACENTER"] }
}
One row per unique name, in input order.
| Field | Meaning |
|---|---|
query_index, query | Position among the unique names, and the entry as you typed it. |
status, exists | success / not_found, and the same as a boolean. |
type | user, bot, channel or group. |
username, source_url | The normalized handle and its https://t.me/... link. |
title | Channel or group title, or the name of a user or bot. |
description | Bio or about text. |
member_count | Subscribers of a channel or members of a group. |
online_count | Members online, shown for some groups. |
monthly_users | Monthly users, shown for some bots. |
verified | Telegram's verified badge. |
has_photo, photo_url | Whether there is a profile photo, and its image link. |
processed_at | UTC time of the lookup. |
[
{
"query_index": 1,
"query": "telegram",
"status": "success",
"exists": true,
"username": "telegram",
"source_url": "https://t.me/telegram",
"type": "channel",
"title": "Telegram News",
"description": "The official Telegram on Telegram. Much recursion. Very Telegram. Wow.",
"member_count": 9334601,
"online_count": null,
"monthly_users": null,
"verified": true,
"has_photo": true,
"photo_url": "https://cdn1.telesco.pe/file/…jpg",
"processed_at": "2026-10-14T09:53:16+00:00"
},
{
"query_index": 2,
"query": "@BotFather",
"status": "success",
"exists": true,
"username": "BotFather",
"source_url": "https://t.me/BotFather",
"type": "bot",
"title": "BotFather",
"description": "BotFather is the one bot to rule them all. Use it to create new bot accounts and manage your existing bots.",
"member_count": null,
"online_count": null,
"monthly_users": 7560507,
"verified": true,
"has_photo": true,
"photo_url": "https://cdn1.telesco.pe/file/…jpg",
"processed_at": "2026-10-14T09:53:16+00:00"
}
]
A name that does not exist comes back with only query, status set to not_found, exists false, the normalized username and source_url, and processed_at.
When the run ends, a summary is saved as OUTPUT in the key-value store: counts, duplicates removed, invalid entries and any names that could not be read.
$2.00 per 1,000 profile rows ($0.002 each), charged as the result-item event. A not_found row counts as a row; turn on Skip names that do not exist if you do not want to pay for those. Invalid entries, duplicates, names that could not be read after retries, and rows removed by a filter are never charged.
Platform usage (compute and datacenter proxy) is billed on top at your normal rates and is small: in our 1,000-name test it came to under one cent.
| Job | Approximate cost |
|---|---|
| 100 names | $0.20 |
| 1,000 names | $2.01 |
| 10,000 names | about $20 |
Set a maximum total charge on the run and it stops cleanly when the budget is used.
Is it legal? It reads public web pages that Telegram serves to anyone, and it does not log in. You are responsible for how you use the data, so follow the privacy laws that apply to you and do not use it to harass or profile private people.
Do I need a Telegram account, phone number or proxy? No account and no phone number. A datacenter proxy is set up for you.
How many names can I run? Up to 100,000 names per run (we tested 10,000). Paste up to about 600 inline, or use the names file link for longer lists.
Why is a field empty? Telegram only shows some fields for some types. Only channels and groups have a member count, only some bots show monthly users, and users with no photo have no photo_url. Missing values are null.
Why is a name not_found? Telegram shows no public page for it: the name is free, was deleted or renamed, or is not public. A single lookup is not proof that a name never existed.
Can I use invite links? Yes, t.me/+code and t.me/joinchat/code links return the public preview Telegram shows (title, photo, member count) when the invite is valid.
Can I schedule it or call it from code? Yes, use schedules, webhooks or the API like any other actor.
group.Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
telegram_urlarrayOptionalTelegram usernames or URLs
One per line: a username (telegram), an @handle (@BotFather), or a t.me link (https://t.me/telegram, https://t.me/s/telegram, t.me/+inviteCode). Duplicates and different spellings of the same name are collapsed into one row. Inline lists work up to about 600 names; use the file link below for longer lists.
listUrlstringOptionalNames file link
Optional link to a plain text or CSV file with one username or t.me link per line, for lists of thousands of names. Added to the names above. Must be a public http or https link.
maxResultsintegerOptionaldefault 1000Maximum profiles
Stop after this many profile rows. 0 means no limit.
Rows left out by a filter are not saved and not charged.
entityTypesarrayOptionalOnly these types
Keep only these kinds of accounts. Leave empty to keep everything. Names that do not exist are dropped when a type is chosen.
skipNotFoundbooleanOptionaldefault falseSkip names that do not exist
Do not save rows for usernames that Telegram does not resolve. They are not charged either.
verifiedOnlybooleanOptionaldefault falseVerified only
Keep only accounts that show Telegram's verified badge.
minMembersintegerOptionalMinimum members or subscribers
Keep channels and groups with at least this many subscribers or members. Users and bots have no such count, so they are dropped when this is set.
maxMembersintegerOptionalMaximum members or subscribers
Keep channels and groups with at most this many subscribers or members. If the minimum is higher than the maximum, the two are swapped.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies are used unless you choose another pool.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| query_index | integer | Position of the name among the unique names, in input order. |
| query | string | The entry as you typed it. |
| status | string | success or not_found. |
| exists | boolean | |
| type | string | user, bot, channel or group (unknown if the page did not say). |
| username | string | |
| source_url | string | |
| title | string | Display name: the channel or group title, or the name of a user or bot. |
| description | string | Bio or about text. |
| member_count | integer | Subscribers of a channel or members of a group. |
| online_count | integer | Members online, shown for some groups. |
| monthly_users | integer | Monthly users shown for some bots. |
| verified | boolean | |
| has_photo | boolean | |
| photo_url | string | |
| processed_at | string |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Profile | One Telegram profile row saved to the dataset, including names that do not exist. | $0.002 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('echofield/telegram-profile-scraper').call({
"telegram_url": [
"telegram",
"@BotFather",
"https://t.me/TelegramTips"
],
"listUrl": "https://example.com/telegram-names.txt",
"maxResults": 1000,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run echofield/telegram-profile-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=echofield/telegram-profile-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Public profile info for usernames or t.me links.
Profiles kept only when they have at least 100,000 members.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.