Scrape public Telegram profile metadata from usernames, @handles, and t.me URLs. The Actor returns structured rows for public users, bots, channels, and groups without requiring a Telegram account or API session.
Use it for lead enrichment, public channel monitoring, influencer research, bot directory checks, and repeatable datasets you can export to CSV, JSON, Excel, API, webhooks, or automation tools.
Who is this for?
- Growth and lead teams checking whether Telegram usernames, channels, groups, or bots are public and usable for outreach research.
- Researchers and analysts building repeatable lists of public Telegram entities with stable URLs and metadata.
- Automation builders feeding normalized Telegram profile rows into CRMs, monitoring jobs, enrichment pipelines, or AI agents.
Use cases
- Bulk public profile lookup: Normalize a list of Telegram handles and export one row per public entity.
- Channel monitoring: Re-run saved inputs to track public channel descriptions, avatars, counters, and latest preview metadata.
- Data enrichment: Add Telegram display names, profile URLs, and public descriptions to existing lead or community datasets.
- Validation workflows: Separate public, not found, not public, and failed targets before downstream processing.
At a glance
- Primary job: Normalize Telegram targets and export public profile/entity metadata.
- Input: Paste public Telegram usernames, @handles, or
t.meURLs. - Output: One dataset row per unique target with status, profile fields, counters when visible, and diagnostics.
- Best for: Bulk public profile lookup, CRM enrichment, monitoring public Telegram entities, and agent workflows.
Input recipes
- Public profile lookup:
targets: ["telegram", "durov"],includeChannelPreview: false. - Channel profile monitor:
targets: ["telegram"],includeChannelPreview: true. - Mixed input normalization:
targets: ["@telegram", "https://t.me/durov"].
What data can you extract?
| Field | Description |
|---|---|
input |
Original input target. |
normalizedUsername |
Normalized Telegram username/handle. |
entityUrl |
Canonical https://t.me/<username> URL. |
status |
success, not_found, not_public, or failed. |
entityType |
Publicly inferred user, bot, channel, group, or unknown. |
title |
Public display name or profile title. |
description |
Public bio/channel/group description when available. |
avatarUrl |
Public avatar or preview image URL. |
subscriberCount, memberCount |
Visible public counters when Telegram exposes them. |
verified, scam, fake, bot |
Visible public labels only; unavailable values stay empty/false. |
latestPreview |
Optional latest public channel/group preview object. |
sourceStatus, errorCode, errorMessage |
Diagnostics for partial failures. |
scrapedAt |
ISO timestamp for the row. |
Example input
{
"targets": ["telegram", "durov", "https://t.me/telegram"],
"includeChannelPreview": false,
"runTimeSecs": 300
}
Example output
{
"input": "telegram",
"normalizedUsername": "telegram",
"entityUrl": "https://t.me/telegram",
"sourceUrl": "https://t.me/telegram",
"sourceStatus": 200,
"status": "success",
"entityType": "channel",
"title": "Telegram News",
"username": "telegram",
"description": "The official Telegram on Telegram.",
"avatarUrl": "https://cdn4.telesco.pe/file/example.jpg",
"subscriberCount": null,
"memberCount": null,
"verified": true,
"scam": false,
"fake": false,
"bot": false,
"latestPreview": null,
"errorCode": null,
"errorMessage": null,
"scrapedAt": "2026-07-24T00:00:00.000Z"
}
Tips for best results
- Start small: Test 2-3 public targets before uploading long lists.
- Use public entities: The Actor cannot access private channels, private groups, hidden members, phone numbers, or account-only data.
- Avoid duplicate spend: Duplicate handles are skipped after normalization.
- Use the right actor for posts: For full public channel post history, use Telegram Channel Posts Scraper.
API usage
Node.js:
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/telegram-public-profiles-scraper").call({
targets: ["telegram", "durov"],
includeChannelPreview: false
});
console.log(run.defaultDatasetId);
Python:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/telegram-public-profiles-scraper").call(run_input={
"targets": ["telegram", "durov"],
"includeChannelPreview": False,
})
print(run["defaultDatasetId"])
cURL:
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~telegram-public-profiles-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"targets":["telegram","durov"],"includeChannelPreview":false}'
MCP and AI agents
Use this Actor from MCP-compatible tools through the official Apify MCP Server.
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/telegram-public-profiles-scraper"
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/telegram-public-profiles-scraper"
}
}
}
Example prompt: "Look up these Telegram public profiles and summarize which ones are channels, bots, or users."
Limits and caveats
- Public data only: The Actor reads anonymous public Telegram web previews. It does not log in or use Telegram API credentials.
- Sparse profiles: Some public targets expose only title/image metadata. Missing fields stay empty instead of being guessed.
- No member lists or phone enrichment: Hidden members, phone numbers, contacts, and private data are out of scope.
- No post-history export:
latestPreviewis a small optional preview, not a replacement for a channel posts scraper.
Legality and responsible use
Process only public data you are allowed to access. Follow Telegram terms, Apify terms, privacy laws, and your own compliance requirements.
Support
Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or run URL, input JSON, expected output, actual output, and at least one reproducible public URL such as a public https://t.me/<username> target.