Home / Tools / Telegram Channel Scraper

Jobs & content

Telegram Channel Scraper

Scrape public Telegram channels without login, phone number or API keys. Get posts with text and HTML, date, views, reactions, forwards, replies, photos, video thumbnails, files and link previews, plus channel info with exact subscriber counts. Date range, keyword filter and deep history.

Run it on Apify API & MCP

Sample output

ChannelDateViewsReactionsText
durov2026-10-111,140,00028,400✨ Designers × AI 🆕 The mockup er…
durov2026-10-101,410,000116,430💸 If your wallet doesn’t look lik…
durov2026-09-113,460,00078,640🤝 Telegram has become the sponsor…

Real rows from the prefilled example run (Oct 19, 2026), 5 of 22+ fields shown. Export as JSON, CSV, Excel or HTML, or read them through the API.

Full JSON of one real output row (8 rows in the example dataset)
{
  "type": "channel",
  "status": "ok",
  "channel": "durov",
  "url": "https://t.me/durov",
  "title": "Pavel Durov",
  "description": "Founder of Telegram.",
  "subscribers": 10325992,
  "subscribersText": "10.3M",
  "photoUrl": "https://cdn4.telesco.pe/file/i6mBunIA0uHW_W8tFCKNu3WlB7f7De1dloTR_A9LqiV_WtoqRwX_USQ8HdgJQp1Tu48XnZhifq-UFvwxcjnTAgUzclb3RagQrWVaQUsdSDzWjdvBODI-lRcn3IOoum7tZpQm8E9yN_OSgFObnHmF99l4tVahn9wUJts5-HnwFxyLgBLAC5odVr4DeW5IAXp1iAxwCz8Huai_N59Gfg3ZiJNLUjM1n108B7Gm63ASU2eF1l_UiSfjYnLaW07...",
  "isVerified": true,
  "isScam": false,
  "isFake": false,
  "photosCount": 102,
  "videosCount": 47,
  "filesCount": null,
  "linksCount": 200,
  "lastPostId": 552,
  "lastPostDate": "2026-10-11T14:52:40Z",
  "webPreviewUrl": "https://t.me/s/durov",
  "input": "durov",
  "scrapedAt": "2026-10-19T10:00:04Z",
  "descriptionHtml": "Founder of Telegram."
}

Output fields

From the Actor's dataset schema. Every row has the same flat shape, so it drops straight into a spreadsheet, a database or an agent's context.

FieldTypeDescription
typestringRow type: post, channel (channel info) or error (free)
statusstringchannel/error rows: ok, not_found, no_web_preview, private, is_group, is_user, is_bot, invalid_input, no_posts, no_matches, fetch_failed
channelstringChannel username
channelTitlestringChannel title
postIdintegerPost ID (message ID within the channel)
urlstringPost or channel URL
datestringPublished (ISO 8601, UTC)
textstringPost text (plain, emoji kept, line breaks preserved)
textHtmlstringPost text as HTML (formatting, links, custom emoji)
viewsintegerViews (Telegram rounds large numbers: 18.9M)
viewsTextstringViews as shown
authorstringAuthor signature, if the channel signs posts
isEditedbooleanPost was edited
forwardedFromobjectOriginal channel/user of a forwarded post: name, url, username, postId
replyToobjectReplied-to post: postId, channel, url, author, text
mediaTypestringtext, photo, video, album, document, audio, voice, round_video, sticker, gif, location, poll, service, unsupported
mediaarrayMedia items: type, url, thumbnailUrl, duration, fileName, fileSize
mediaCountintegerNumber of media items
photoUrlsarrayPhoto URLs
videoThumbnailUrlsarrayVideo thumbnail URLs
documentNamesarrayAttached file names
linkPreviewobjectLink preview: url, siteName, title, description, imageUrl
pollobjectPoll: question, type, options (text, percent), voters
linksarrayLinks in the post text

Pricing

Pay per result, billed by Apify. No subscription and no minimum. Discount tiers apply automatically on paid Apify plans.

EventFree planBronzeSilverGold
Post result main
Charged once for each Telegram post successfully saved to the dataset.
$0.001$0.0009$0.0008$0.0007
Channel info
Charged once for each channel information row successfully saved to the dataset.
$0.002$0.0017$0.0015$0.0013

Examples on the Free plan: 100 post results = $0.10, 1,000 post results = $1, 10,000 post results = $10. Apify's Free plan includes $5 of monthly usage credit. Prices read from the Apify API at build time (2026-10-19).

Example input

This is the prefilled input on the Store page. Keep it and click Start to see real data in seconds.

{
  "channels": [
    "durov"
  ],
  "maxPostsPerChannel": 20,
  "keywordMode": "contains",
  "matchAllKeywords": false,
  "wholeWordsOnly": true,
  "maxScannedPostsPerChannel": 5000,
  "includeChannelInfo": true,
  "includeHtml": true,
  "includeServiceMessages": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "alwaysUseProxy": false,
  "maxConcurrency": 10
}

Use it from code, no-code or an AI agent

cURL (one request, returns rows)
curl -X POST \
  "https://api.apify.com/v2/acts/wrenfield-data~telegram-channel-scraper/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"channels": ["durov"], "maxPostsPerChannel": 20, "keywordMode": "contains", "matchAllKeywords": false, "wholeWordsOnly": true, "maxScannedPostsPerChannel": 5000, "includeChannelInfo": true, "includeHtml": true, "includeServiceMessages": false, "proxyConfiguration": {"useApifyProxy": true}, "alwaysUseProxy": false, "maxConcurrency": 10}'
Python
# pip install apify-client
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("wrenfield-data/telegram-channel-scraper").call(
    run_input={
    "channels": [
        "durov"
    ],
    "maxPostsPerChannel": 20,
    "keywordMode": "contains",
    "matchAllKeywords": False,
    "wholeWordsOnly": True,
    "maxScannedPostsPerChannel": 5000,
    "includeChannelInfo": True,
    "includeHtml": True,
    "includeServiceMessages": False,
    "proxyConfiguration": {
        "useApifyProxy": True
    },
    "alwaysUseProxy": False,
    "maxConcurrency": 10
},
    max_total_charge_usd=1.00,  # hard cap for this run
)
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row)
JavaScript / Node
// npm i apify-client
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('wrenfield-data/telegram-channel-scraper').call({
  "channels": [
    "durov"
  ],
  "maxPostsPerChannel": 20,
  "keywordMode": "contains",
  "matchAllKeywords": false,
  "wholeWordsOnly": true,
  "maxScannedPostsPerChannel": 5000,
  "includeChannelInfo": true,
  "includeHtml": true,
  "includeServiceMessages": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "alwaysUseProxy": false,
  "maxConcurrency": 10
}, { maxTotalChargeUsd: 1 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
MCP (Claude, Cursor, VS Code, any MCP client)
{
  "mcpServers": {
    "wrenfield-telegram-channel-scraper": {
      "url": "https://mcp.apify.com?tools=wrenfield-data/telegram-channel-scraper"
    }
  }
}

Remote MCP server hosted by Apify. Sign in with OAuth on first use, or send Authorization: Bearer <APIFY_TOKEN>. The tool appears as wrenfield-data--telegram-channel-scraper. More client setups on the MCP page.

n8n, Make, Zapier

Use the official Apify node or app, pick Run Actor, enter wrenfield-data/telegram-channel-scraper and paste the input JSON above. Then read the run's dataset items. Ready-made n8n workflows are on the n8n templates page.

FAQ

How much does Telegram Channel Scraper cost?

$0.001 per post result on the Apify Free plan ($1 per 1,000), billed per result by Apify with no subscription. Plus $0.002 per channel info. Higher Apify plans get the discounted tiers shown in the pricing table. You can cap any run with a maximum cost.

Related tools

Compare and plan

Try Telegram Channel Scraper now

Open it on Apify, keep the prefilled example and click Start. The Apify Free plan includes $5 of monthly credit, no card needed.

Open on Apify