# Telegram Channel and Group Scraper (tgstat, telegramic) (`jungle_synthesizer/tgstat-telegramic-group-directory-scraper`) Actor

Collect Telegram channel and group listings from tgstat and telegramic in one row shape: name, @handle, t.me link, category, members, growth, post reach, language and country where reported. Filter by directory, channel or group, category, country ranking and ranking order.

- **URL**: https://apify.com/jungle_synthesizer/tgstat-telegramic-group-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Social media, Lead generation, Other
- **Stats:** 1 total users, 1 monthly users, 71.4% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 record scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Telegram Channel and Group Directory Scraper (tgstat, telegramic)

Collects Telegram channel and group listings from two public directories, tgstat and telegramic, and returns them in one row shape. Each row has the name, @handle, t.me link, category and member count, plus growth, post reach, language and country where the directory reports them.

***

### Telegram Directory Scraper Features

- Combine tgstat rankings and the telegramic directory in a single run and a single dataset
- Choose channels, groups or both
- Filter by category with one list that works across both directories
- Read tgstat's regional rankings for Ukraine, Belarus, Uzbekistan, Kazakhstan, Kyrgyzstan, Iran, China, India and Ethiopia
- Pull growth rankings (today, yesterday, 7 days, 30 days) to see which channels are rising
- Get post reach and citation index for tgstat channels, monthly active users and weekly messages for tgstat groups
- Get language, about text and user rating for telegramic listings
- Export a clean t.me link and handle for every public listing

***

### Who needs Telegram directory data?

- **OSINT and social-graph analysts** - map the biggest channels and groups in a topic or a country
- **Growth marketers** - find audiences by language, category and size before buying or partnering
- **Crypto and fintech community trackers** - follow which communities are gaining members
- **Researchers** - build a sample of channels per category and region with comparable counts
- **Lead and outreach teams** - assemble a list of public communities with their handles

***

### How Telegram Directory Scraper Works

1. You pick the directories, channel or group, categories, countries and ranking orders.
2. The actor reads each matching listing page and collects every entry on it.
3. For telegramic, it opens each entry to read the member count, language and about text.
4. Duplicates are removed and every row is returned in the same shape, tagged with its source directory.

***

### Input

```json
{
    "sources": ["tgstat", "telegramic"],
    "groupTypes": ["channel", "group"],
    "categories": ["crypto"],
    "regions": ["global"],
    "rankings": ["members"],
    "maxItems": 15
}
```

| Field          | Type    | Default                    | Description |
|----------------|---------|----------------------------|----------------------------------------------------------------------------------------------------------|
| `sources`      | array   | `["tgstat", "telegramic"]` | Directories to read. Empty means both. |
| `groupTypes`   | array   | `["channel", "group"]`     | Channels, groups or both. Empty means both. |
| `categories`   | array   | `["crypto"]`               | Categories to keep. A directory without the category you pick adds nothing for it. Empty means all. |
| `regions`      | array   | `["global"]`               | tgstat country rankings. Each row records the country it was ranked in. Not used for telegramic. |
| `rankings`     | array   | `["members"]`              | tgstat ranking orders. Each one surfaces a different top 100. Not used for telegramic. |
| `maxItems`     | integer | `15`                       | Maximum number of listings to return. |
| `resumeCursor` | string  | none                       | Cursor from a previous run's Output, to continue a crawl that stopped early. |

tgstat lists the top 100 for each combination of country, channel or group, category and ranking. To go wide, select more categories, countries and ranking orders. telegramic lists every page of each category.

#### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes, because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted, start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window. On the free tier, that is roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque, so supply it unmodified.

***

### Telegram Directory Scraper Output Fields

```json
{
    "source_directory": "tgstat",
    "listing_id": "blumcrypto",
    "group_name": "Blum: All Crypto – One App",
    "telegram_handle": "blumcrypto",
    "telegram_url": "https://t.me/blumcrypto",
    "description": null,
    "category": "Cryptocurrencies",
    "language": null,
    "country": null,
    "member_count": 13323823,
    "member_growth": null,
    "growth_period": null,
    "average_post_reach": 123900,
    "citation_index": 3309,
    "monthly_active_users": null,
    "messages_7d": null,
    "rating": null,
    "is_channel": true,
    "source_url": "https://tgstat.com/ratings/channels/crypto?sort=members"
}
```

| Field                  | Type    | Description                                                                       |
|------------------------|---------|-----------------------------------------------------------------------------------|
| `source_directory`     | string  | `tgstat` or `telegramic`                                                          |
| `listing_id`           | string  | The directory's identifier for the listing (the handle when public)               |
| `group_name`           | string  | Channel or group name                                                             |
| `telegram_handle`      | string  | Telegram handle without the at sign. Empty for private tgstat listings            |
| `telegram_url`         | string  | t.me link. Empty for private tgstat listings                                      |
| `description`          | string  | About text. telegramic only                                                       |
| `category`             | string  | Category as the directory labels it                                               |
| `language`             | string  | Language the directory reports. telegramic only                                   |
| `country`              | string  | Country of the tgstat regional ranking the listing was found in                   |
| `member_count`         | integer | Members or subscribers                                                            |
| `member_growth`        | integer | Member change over `growth_period`. Present when a tgstat growth ranking was read |
| `growth_period`        | string  | Window `member_growth` covers: `today`, `yesterday`, `7d` or `30d`                |
| `average_post_reach`   | integer | Average views of a channel post. tgstat channels only                             |
| `citation_index`       | number  | tgstat citation index. tgstat channels only                                       |
| `monthly_active_users` | integer | Monthly active members. tgstat groups only                                        |
| `messages_7d`          | integer | Messages posted in the last 7 days. tgstat groups only                            |
| `rating`               | number  | Average user rating out of 5. telegramic only                                     |
| `is_channel`           | boolean | `true` for a channel, `false` for a group                                         |
| `source_url`           | string  | Directory page the listing was read from                                          |

Fields marked with one directory are empty for the other. A listing that appears in more than one growth window or country is returned once per window and country, so the figures stay comparable.

***

### FAQ

#### How do I scrape tgstat and telegramic with Telegram Directory Scraper?

Telegram Directory Scraper needs no account and no API key. Choose the directories, whether you want channels or groups, and the categories. Run it and it returns one dataset in a single shape.

#### What data can I get from tgstat and telegramic?

Telegram Directory Scraper returns name, handle, t.me link, category and member count for every listing. tgstat adds growth, post reach, citation index, monthly active users and weekly messages. telegramic adds language, about text and user rating.

#### Can I filter by category or country?

Yes. Telegram Directory Scraper takes a category list that is translated to each directory's own categories, and a country list that selects tgstat's regional rankings. Language is reported by telegramic but is not available as a filter.

#### How many listings can one run return?

tgstat shows the top 100 for each combination of country, channel or group, category and ranking order, so combining more of those returns more. telegramic lists every page of each category, which is roughly 1,800 channels and 500 groups for the unfiltered lists.

#### Does it include private channels?

Private tgstat channels appear with their name and counts but without a handle or t.me link, because they have none.

***

### Need More Features?

Need another directory or another field? Send a request through the actor's Issues tab.

### Why Use Telegram Directory Scraper?

- **One row shape for two directories** - rankings and browse listings arrive in the same fields with the source tagged
- **Growth, reach and activity where they exist** - tgstat's ranking statistics are kept, not flattened away
- **Wide coverage from simple inputs** - categories, countries and ranking orders multiply the listings you reach
- **Clean output** - numbers are real numbers, handles and t.me links are separate fields, duplicates are removed

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `sources` (type: `array`):

Which directories to read. Leave empty for both.

## `groupTypes` (type: `array`):

Channels broadcast to subscribers, groups are chats members post in. Leave empty for both.

## `categories` (type: `array`):

Only listings in these categories. Each directory names its categories differently, so a directory without the category you pick contributes nothing for it. Leave empty for every category.

## `regions` (type: `array`):

tgstat publishes a separate ranking per country. Pick the countries whose rankings you want; each row records the country it was ranked in. Leave empty for the global ranking. Ignored for telegramic.

## `rankings` (type: `array`):

tgstat lists the top 100 per ranking, so each extra ranking surfaces different listings. Channel-only orders are skipped for groups and the reverse. Leave empty for most members. Ignored for telegramic.

## `maxItems` (type: `integer`):

Maximum number of listings to return.

## Actor input object example

```json
{
  "sp_contact": "Share your email here...",
  "sources": [
    "tgstat",
    "telegramic"
  ],
  "groupTypes": [
    "channel",
    "group"
  ],
  "categories": [
    "crypto"
  ],
  "regions": [
    "global"
  ],
  "rankings": [
    "members"
  ],
  "maxItems": 15
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "sp_contact": "Share your email here...",
    "sources": [
        "tgstat",
        "telegramic"
    ],
    "groupTypes": [
        "channel",
        "group"
    ],
    "categories": [
        "crypto"
    ],
    "regions": [
        "global"
    ],
    "rankings": [
        "members"
    ],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/tgstat-telegramic-group-directory-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "sp_contact": "Share your email here...",
    "sources": [
        "tgstat",
        "telegramic",
    ],
    "groupTypes": [
        "channel",
        "group",
    ],
    "categories": ["crypto"],
    "regions": ["global"],
    "rankings": ["members"],
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/tgstat-telegramic-group-directory-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "sp_contact": "Share your email here...",
  "sources": [
    "tgstat",
    "telegramic"
  ],
  "groupTypes": [
    "channel",
    "group"
  ],
  "categories": [
    "crypto"
  ],
  "regions": [
    "global"
  ],
  "rankings": [
    "members"
  ],
  "maxItems": 15
}' |
apify call jungle_synthesizer/tgstat-telegramic-group-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/tgstat-telegramic-group-directory-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/W989DJAgcX3aNjPpb/builds/ve6w9K8DRhkaEV2Kr/openapi.json
