# WhatsApp Group Links Scraper (`maximedupre/whatsapp-group-links`) Actor

Find public WhatsApp group and Channel invite links by topic or in curated directories. Get normalized links, source context, discovery details, and public preview metadata when available in a structured dataset.

- **URL**: https://apify.com/maximedupre/whatsapp-group-links.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.55 / 1,000 invite links

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🔎 Find public WhatsApp group links from topics and directories

Researchers, community managers, and developers can use WhatsApp Group Links Scraper to find public WhatsApp group and Channel invite links from a topic search or a curated directory. Each saved row gives you a normalized invite URL, the parsed invite identifier, the public source page, and discovery details, with public preview data when available. This gives you structured links to review, filter, or pass into a workflow without joining WhatsApp groups.

- Find many public links for a broad topic with **[1000 WhatsApp Group Links](https://apify.com/maximedupre/whatsapp-group-links/examples/1000-whatsapp-group-links)**.
- Search one public social network for topic matches with **[WhatsApp Group Link Search](https://apify.com/maximedupre/whatsapp-group-links/examples/whatsapp-group-link-search)**.
- Browse public directory listings by category and review publisher claims with **[WhatsApp Group Directory](https://apify.com/maximedupre/whatsapp-group-links/examples/whatsapp-group-directory)**.
- Include publicly indexed Channel invites in a run with **[WhatsApp Channel Links](https://apify.com/maximedupre/whatsapp-group-links/examples/whatsapp-channel-links)**.
- Collect normalized public invite URLs with **[WhatsApp Group Invite Links](https://apify.com/maximedupre/whatsapp-group-links/examples/whatsapp-group-invite-links)**.

#### 📦 Public invite links with source context

The Actor saves one row for each first eligible public invite link. It normalizes the URL and includes its parsed identifier, link form, source page, and how the match was found. Directory rows can include publisher-claimed member counts, and public invite previews can include a name, description, image URL, invite type, or availability note when shown.

When the same source invite appears again through another topic, URL, handle, ID, or similar submitted value, the later match is ignored. The saved row keeps only the first match's source context.

#### ▶️ Search a topic or browse a public directory

Choose `Search by topic` to search one selected public social network. Choose `Browse directories` to search a category in curated public directories. A topic run can use related phrases and one or broader search coverage. A directory run can filter listings by publisher-claimed member count. Turn on `Include WhatsApp Channels` when you want publicly indexed Channel invite links as well as group links.

The Actor reads public web pages. It does not join WhatsApp groups, read chats, or send messages.

#### ⚙️ Input

Use one discovery method per run. Fields in the other section are ignored for that run.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `discoveryMethod` | string | Chooses `topic` to search one public social network or `directory` to browse a category in curated public directories. The other section's fields are ignored. |
| `topics` | array of strings | Provides one or more topics for public web search. Each topic is searched in the run. Used with `topic`. |
| `socialNetwork` | string | Chooses one public social network for topic matches: `facebook`, `reddit`, `youtube`, `instagram`, or `x`. Used with `topic`. |
| `region` | string | Optionally biases topic discovery toward a country or region. Used with `topic`. |
| `topicMatching` | string | Chooses focused topic matching or broader discovery through related phrases. Used with `topic`. |
| `searchCoverage` | string | Chooses one public search index or broader coverage across independent public search indexes. Used with `topic`. |
| `directoryCategory` | string | Provides the category to browse in curated public directories. Used with `directory`. |
| `minimumClaimedMembers` | integer | Keeps directory listings that claim at least this many members. The value is a publisher claim, not an actual member count. Listings without a claimed count cannot pass this filter. Used with `directory`. |
| `includeChannels` | boolean | Also returns publicly indexed WhatsApp Channel invite links. Leave it off to return group links only. |
| `maxResults` | integer | Stops after this many matching links. Leave it empty to collect all available results until public sources are exhausted. This is a limit, not a promise that the source will return this many links. |

**Example input**

This is the public input from a successful current-beta default-input run:

```json
{
  "discoveryMethod": "topic",
  "topics": [
    "technology"
  ],
  "socialNetwork": "instagram",
  "topicMatching": "focused",
  "searchCoverage": "single",
  "includeChannels": false,
  "maxResults": 1
}
```

#### 🧾 Output

The output schema links to the default dataset. Topic and directory discoveries use the same dataset row shape. Optional fields appear when the public source provides them.

**Dataset link**

| Field | Type | What it does |
| --- | --- | --- |
| `dataset` | string | Links to the discovered rows in the default dataset. |

**Dataset row fields**

| Field | Type | What it does |
| --- | --- | --- |
| `inviteUrl` | string | Required normalized public WhatsApp group or Channel invite URL. |
| `inviteIdentifier` | string | Required identifier parsed from the normalized invite URL. |
| `linkType` | string | Required URL form: `groupInvite`, `legacyGroupInvite`, or `channelInvite`. |
| `source` | object | Required public page where the invite was found. |
| `source.pageUrl` | string | Required URL of the public page that contained or listed the invite. |
| `source.title` | string | Optional title shown for the public source page. |
| `source.snippet` | string | Optional short text shown around the invite on the public source page. |
| `discovery` | object | Required details about how this invite was found in the run. |
| `discovery.method` | string | Required method, either `topic` or `directory`. |
| `discovery.topic` | string | Topic that first caused this invite to be saved. Later matching topics are not included. |
| `discovery.socialNetwork` | string | Public social network selected for topic discovery. |
| `discovery.region` | string | Country or region used to bias topic discovery, when selected. |
| `discovery.searchSource` | string | Public search index that returned the topic match. |
| `discovery.directorySource` | string | Public directory that listed the invite. |
| `discovery.category` | string | Category selected for directory browsing. |
| `discovery.collectedAt` | string | Required collection time in ISO 8601 format. |
| `claimedMemberCount` | integer | Optional member count claimed by a directory listing. This is not a verified member count. |
| `claimedMemberCountText` | string | Optional original member count claim from the directory listing. |
| `preview` | object | Optional public metadata exposed for the invite. |
| `preview.name` | string | Optional public group or Channel name shown in the invite preview. |
| `preview.description` | string | Optional public group or Channel description shown in the invite preview. |
| `preview.imageUrl` | string | Optional URL of the public invite preview image. |
| `preview.inviteType` | string | Optional invite type exposed by the public preview. |
| `preview.availabilityNote` | string | Optional public note about preview metadata availability. |

Rows are saved as soon as a first eligible link is found. If the same source invite appears through another keyword, URL, handle, ID, or similar submitted value, the later match is ignored. A later match does not add evidence to the saved row.

**Topic search row**

This is a genuine topic-search row from the current beta:

```json
{
  "inviteUrl": "https://chat.whatsapp.com/CpHB6uBz2u9D6XgDdYuDBX",
  "inviteIdentifier": "CpHB6uBz2u9D6XgDdYuDBX",
  "linkType": "groupInvite",
  "source": {
    "pageUrl": "https://www.facebook.com/groups/529137332314979/posts/916448290250546/",
    "title": "Free ICT WhatsApp group for tech tutorials and discussions",
    "snippet": "Free ICT WhatsApp group for tech tutorials and discussionsFacebook · ICT group9 comments · 2 years agoFacebook · ICT group9 comments · 2 years agoClick the link below to join us: WhatsApp Group Link: Join Now! https: //chat.whatsapp.com/CpHB6uBz2u9D6XgDdYuDBX Let's learn and ...Read more"
  },
  "discovery": {
    "method": "topic",
    "topic": "technology",
    "socialNetwork": "facebook",
    "searchSource": "Google",
    "collectedAt": "2026-09-04T00:29:16.754Z"
  },
  "preview": {
    "description": "WhatsApp Group Invite",
    "imageUrl": "https://static.whatsapp.net/rsrc.php/v4/yO/r/rukeqTVNJDY.png",
    "inviteType": "REGULAR",
    "availabilityNote": "Follow this link to join"
  }
}
```

**Directory group row**

This genuine directory row shows a publisher-claimed count and a public preview:

```json
{
  "inviteUrl": "https://chat.whatsapp.com/L72mOEZG0HGELA4d2wWAIQ",
  "inviteIdentifier": "L72mOEZG0HGELA4d2wWAIQ",
  "linkType": "groupInvite",
  "source": {
    "pageUrl": "https://joinchatgroups.com/",
    "title": "Football and Friendship",
    "snippet": "Football and Friendship200+ members💬 Join Now"
  },
  "discovery": {
    "method": "directory",
    "directorySource": "joinchatgroups.com",
    "category": "Sports Groups",
    "collectedAt": "2026-09-04T00:32:52.429Z"
  },
  "claimedMemberCount": 200,
  "claimedMemberCountText": "200+ members",
  "preview": {
    "description": "WhatsApp Group Invite",
    "imageUrl": "https://static.whatsapp.net/rsrc.php/v4/yO/r/rukeqTVNJDY.png",
    "inviteType": "REGULAR",
    "availabilityNote": "Follow this link to join"
  }
}
```

**Channel invite row**

This genuine directory row shows a `channelInvite` link. The count in the source snippet is still a publisher claim:

```json
{
  "inviteUrl": "https://www.whatsapp.com/channel/0029VbAUaVU4Y9lkHgI76i1E",
  "inviteIdentifier": "0029VbAUaVU4Y9lkHgI76i1E",
  "linkType": "channelInvite",
  "source": {
    "pageUrl": "https://joinchatgroups.com/",
    "title": "Radhe Radhe",
    "snippet": "Radhe Radhe500+ members💬 Join Now"
  },
  "discovery": {
    "method": "directory",
    "directorySource": "joinchatgroups.com",
    "category": "Indian Groups",
    "collectedAt": "2026-09-04T00:32:51.340Z"
  },
  "claimedMemberCount": 500,
  "claimedMemberCountText": "500+ members",
  "preview": {
    "name": "STATUS EVERYONE LOVE ❤️ & SAD 😢",
    "description": "Channel • 4.2K followers • PLEASE FELLOW",
    "imageUrl": "https://mmg.whatsapp.net/m1/v/t24/An_pSs1soLD7IvgeTXhg_5U5nJA7CRe7vein0LHFdB-kMqXbD5xY32GQT8lLhTTt4V_W4gnOx7kyhQ6WUI3pChK6Ar_gKhoEovejTRvSPCoidAxXiy1zGWZsFszhbeLtf_Sr88Vl7r8NabxCRDq_?_nc_gid=HtZ1mfTY3JA8XuuNvr8PLA&_nc_oc=AdrZ4jiPlKg6aykSqzp1SbS1iIfkGZbIX6Ce4CUuRSIYAQ4pUeXfj-PW3OmfpNZqOOE&ccb=10-5&oh=01_Q5Aa5gG2ooqLLgMIQ4WysP1MwHr8-iVJjBeARa7g1xuVkxfg6g&oe=6AC173FD&_nc_sid=471a72",
    "availabilityNote": "Use this link to open in WhatsApp"
  }
}
```

#### 💳 Pricing

**Pay per event**

This Actor uses pay-per-event pricing. One `Invite link` event is charged when one normalized public WhatsApp invite link and its source context are saved to the dataset. Apify shows the current event price before a paid run.

#### 🔌 Integrations

**API and exports**

Use the Apify API to start runs and read the default dataset. You can also export the dataset as JSON, CSV, Excel, XML, RSS, or HTML and pass the structured rows into your own workflow.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Can it find private WhatsApp groups?

No. It finds invite links that are discoverable from public web pages and curated public directories. Private group data is outside the Actor's scope.

##### Does it join groups or read messages?

No. It does not join groups, read chats, collect member lists, or send messages.

##### Can it verify that an invite still works?

No. A public search match or preview does not prove that an invite is active, official, safe, moderated, or topically exact. Review links before using them.

##### Why can a topic result look broader than my topic?

The topic can match text near an invite on a public source page. The group or Channel name may be broader, and public search results can be stale.

##### How are duplicate links handled?

The first eligible occurrence is saved at once. If the same invite appears again through another topic, URL, handle, ID, or similar submitted value, the later match is ignored.

##### What does a directory member count mean?

It is a count claimed by the directory publisher. It is not an actual or verified member count, and listings without a claimed count cannot pass `minimumClaimedMembers`.

##### What happens when I leave the result limit empty?

`maxResults` returns all available results until the public sources are exhausted. The source may still provide fewer links than you expect.

##### Can I include WhatsApp Channels?

Yes. Set `includeChannels` to `true` to include publicly indexed Channel invite links. With it off, the Actor returns group links only.

##### What happens when public preview data is missing?

The Actor keeps the available discovery data and does not invent missing preview values. Optional preview fields can be absent.

##### Can I combine different search setups in one run?

No. Use one discovery method and one coherent topic or directory setup per run. Run separate jobs for materially different configurations.

##### Does it return every WhatsApp group?

No exhaustive census is promised. The saved set depends on the public sources, your settings, available matches, and first-match deduplication.

### 📝 Changelog

**v0.0** (04-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~whatsapp-group-links/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Telegram Channels Scraper](https://apify.com/maximedupre/telegram-channels-scraper) finds or enriches public Telegram channels when you want a parallel community search.
- [Telegram Info Scraper](https://apify.com/maximedupre/telegram-info-scraper) checks public Telegram usernames, channels, groups, and bots for adjacent community research.
- [Telegram Channel Messages Scraper](https://apify.com/maximedupre/telegram-channel-messages-scraper) collects public Telegram channel posts when a small channel preview is not enough.
- [Facebook Group Profile Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper) profiles a known public Facebook group when you need more detail about a source group.
- [YouTube Channel Search Scraper](https://apify.com/maximedupre/youtube-channel-search-scraper) finds public YouTube channels when topic research continues on YouTube.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `discoveryMethod` (type: `string`):

Choose one way to find public WhatsApp invite links.

## `topics` (type: `array`):

Enter one or more topics for public web search. Each topic is searched in this run.

## `socialNetwork` (type: `string`):

Choose one public social network to search for topic matches.

## `region` (type: `string`):

Optionally bias topic discovery toward this country or region.

## `topicMatching` (type: `string`):

Choose focused topic matching or broader discovery through related phrases.

## `searchCoverage` (type: `string`):

Choose one public search index or broader coverage across independent public search indexes.

## `directoryCategory` (type: `string`):

Enter the category to browse in curated public directories.

## `minimumClaimedMembers` (type: `integer`):

Keep directory listings that claim at least this many members. This is a publisher claim, not an actual member count. Listings without a claimed count cannot pass this filter.

## `includeChannels` (type: `boolean`):

Also return publicly indexed WhatsApp Channel invite links. Leave this off to return group links only.

## `maxResults` (type: `integer`):

Stop after this many matching links. Leave it empty to collect all available results until public sources are exhausted. This is a limit, not a promise that the source will return this many links.

## Actor input object example

```json
{
  "discoveryMethod": "topic",
  "topics": [
    "technology"
  ],
  "socialNetwork": "facebook",
  "topicMatching": "focused",
  "searchCoverage": "single",
  "includeChannels": false,
  "maxResults": 10
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open normalized public invite links with source context, discovery details, and available preview metadata.

# 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 = {
    "discoveryMethod": "topic",
    "topics": [
        "technology"
    ],
    "socialNetwork": "facebook",
    "topicMatching": "focused",
    "searchCoverage": "single",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/whatsapp-group-links").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 = {
    "discoveryMethod": "topic",
    "topics": ["technology"],
    "socialNetwork": "facebook",
    "topicMatching": "focused",
    "searchCoverage": "single",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/whatsapp-group-links").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 '{
  "discoveryMethod": "topic",
  "topics": [
    "technology"
  ],
  "socialNetwork": "facebook",
  "topicMatching": "focused",
  "searchCoverage": "single",
  "maxResults": 10
}' |
apify call maximedupre/whatsapp-group-links --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/whatsapp-group-links"
        }
    }
}

```

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/1Hr3jUeljTTmsdCKJ/builds/POyjbFU4s8MZvdu0v/openapi.json
