# WhatsApp Channel Search & Scraper (`memo23/whatsapp-channel-search`) Actor

Search WhatsApp channels by keyword and scrape their public metadata — name, follower count, bio, and avatar. Also resolves direct channel links and group invite links. No WhatsApp account, API key, or login needed. JSON or CSV output.

- **URL**: https://apify.com/memo23/whatsapp-channel-search.md
- **Developed by:** [Muhamed Didovic](https://apify.com/memo23) (community)
- **Categories:** Social media, AI, Agents
- **Stats:** 4 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $7.00 / 1,000 channel results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

## WhatsApp Channel Search & Scraper — find channels by keyword

**Search WhatsApp channels by keyword** and scrape their public metadata — name, follower count, bio, and avatar. Type a query like `crypto trading` and get back a structured list of matching channels, or feed direct channel/group links you already have. Needs **no WhatsApp account, no API key, and no login**.

![How WhatsApp Channel Search works](https://raw.githubusercontent.com/muhamed-didovic/muhamed-didovic.github.io/main/assets/how-it-works-whatsapp-channel.png)

### Why use this scraper?

- **Keyword search, not just links** — WhatsApp has no public channel directory; this actor recovers channels by free-text query so you can discover them, not only look up ones you already know.
- **Zero setup** — no WhatsApp login, no phone number, no API credentials.
- **Clean metadata** — channel name, follower count (both parsed integer and raw "234M"), bio, and avatar URL.
- **Direct links too** — paste `whatsapp.com/channel/{id}` pages or `chat.whatsapp.com/{code}` group invites for exact lookups.
- **Dead-link filtering** — invalid or unindexed IDs return WhatsApp's generic fallback page; those are detected and dropped, so you only pay for real channels.
- **Query attribution** — every result is tagged with the `matchedQuery` that surfaced it.

### Overview

Give the actor one or more search queries. For each, it discovers public WhatsApp channels through search-engine indexing, fetches each channel's public page, and returns one structured row per channel with name, followers, bio, and avatar. You can also pass direct channel or group-invite URLs to scrape alongside (or instead of) the searches.

### Supported inputs

| Input | Example | Result |
|---|---|---|
| Search query | `crypto trading` | list of matching channels with metadata |
| Multiple queries | `["football news", "job alerts india"]` | channels for each, tagged by query |
| Direct channel link | `https://whatsapp.com/channel/0029Va...` | that channel's metadata |
| Channel id only | `0029Va4K0PZ5a245NkngBA2M` | same as the full URL |
| Group invite link | `https://chat.whatsapp.com/AbCdEf...` | group name + avatar |

### Use cases

- **Community discovery** — find active WhatsApp channels in a niche (crypto, sports, local news, jobs) to follow, partner with, or advertise on.
- **Competitive & market research** — size channels by follower count across a topic.
- **Lead generation** — surface channels relevant to your product or region.
- **Brand monitoring** — track channels mentioning your brand or category.
- **Link enrichment** — turn channel/invite links you've collected into structured records.

### How it works

1. **Discover** — for each query, the actor searches `site:whatsapp.com/channel <query>` across multiple search engines, cascading to the next if one is unavailable, and collects channel IDs.
2. **Hydrate** — every channel/group URL (discovered + direct input) is fetched from WhatsApp's public page in a parallel sliding window.
3. **Parse** — name, follower count, bio, and avatar are read from the page's Open Graph metadata; the matched query is attached.
4. **Filter** — pages that resolve to WhatsApp's generic "dead link" fallback are dropped.
5. **Push** — one dataset row per channel, JSON or CSV.

### Input configuration

```json
{
    "queries": ["crypto trading", "football news"],
    "startUrls": ["https://whatsapp.com/channel/0029Va4K0PZ5a245NkngBA2M"],
    "maxChannelsPerQuery": 30,
    "maxItems": 1000,
    "proxy": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
````

| Field | Type | Default | Description |
|---|---|---|---|
| `queries` | array | — | Free-text searches, one per line |
| `startUrls` | array | `[]` | Direct channel or group-invite URLs |
| `maxChannelsPerQuery` | integer | `30` | Cap on channels returned per query |
| `maxItems` | integer | `1000` | Hard cap on channels scraped in the run |
| `maxConcurrency` | integer | `10` | Parallel page fetches |
| `proxy` | object | none | Optional; a residential proxy is recommended for large query batches |

> **Tip:** For big query batches, enable an Apify **residential** proxy. Channel-page hydration needs no proxy, but the search-engine discovery step is rate-limited per IP, so a proxy keeps discovery flowing.

### Output overview

```json
{
    "url": "https://www.whatsapp.com/channel/0029Va4K0PZ5a245NkngBA2M",
    "type": "channel",
    "channelId": "0029Va4K0PZ5a245NkngBA2M",
    "inviteCode": null,
    "name": "WhatsApp",
    "followers": 234000000,
    "followersRaw": "234M",
    "description": "WhatsApp's official channel. Follow for our latest feature launches, updates and more.",
    "avatarUrl": "https://mmg.whatsapp.net/v/t61.24694-24/...jpg",
    "matchedQuery": "crypto trading",
    "scrapedAt": "2026-07-16T04:00:00.000Z"
}
```

### Key output fields

| Field | Description |
|---|---|
| `name` | Channel or group display name |
| `type` | `channel` or `group` (invite links) |
| `channelId` / `inviteCode` | The id from the channel URL / the code from a group invite |
| `followers` | Follower count as an integer (e.g. `234000000`) |
| `followersRaw` | Follower count as WhatsApp displays it (e.g. `"234M"`) |
| `description` | Channel bio |
| `avatarUrl` | Profile image on WhatsApp's CDN |
| `matchedQuery` | The search query that surfaced this channel (`null` for direct URLs) |

### FAQ

**Do I need a WhatsApp account or API key?**
No. The actor reads WhatsApp's public channel/group pages — no account, no login, no Business API.

**How complete is keyword search?**
Discovery relies on public search-engine indexing of WhatsApp channel pages, so coverage is broad but **not** the full in-app directory (WhatsApp doesn't expose that publicly). Popular and established channels are found reliably; brand-new or unindexed channels may not appear. For guaranteed lookups, pass direct channel URLs.

**Why should I use a proxy?**
Only the discovery step is rate-limited (it queries search engines). A residential proxy spreads that load so large query batches don't stall. Scraping the channel pages themselves needs no proxy.

**Can it read channel messages or private chats?**
No — only public channel *metadata* (name, followers, bio, avatar). It never accesses messages, private chats, or anything behind login.

**What about phone numbers or member lists?**
WhatsApp doesn't publish those on channel pages, so the actor can't return them.

**Why did some results get dropped?**
Invalid or unindexed channel IDs return WhatsApp's generic fallback page. The actor detects those and skips them so you're not charged for empty records.

### Support

- **Issues tab** — fastest way to report a problem or request a field; I usually respond within 24 hours.
- The actor self-reports failed runs to me automatically, so breakages are often being fixed before you write in.

### Additional services

Need scheduled channel-growth tracking, discovery at larger scale, a private variant, or a scraper for another platform? Reach out via the Issues tab or my Apify profile.

### Explore more scrapers

Check my Apify profile for more scrapers — Telegram channels, jobs (LinkedIn, Indeed, Glassdoor, Upwork), real estate (Zillow, Realtor, Rightmove, ImmoScout24, Idealista), reviews (Trustpilot, Glassdoor), travel (Expedia), and many more.

### ⚠️ Disclaimer

This actor collects only **publicly available data** from WhatsApp's public channel and group-invite pages — the same information any logged-out visitor sees in a browser. It does not access private chats, does not read messages, does not join channels or groups, and does not bypass any authentication. You are responsible for how you use the data: comply with WhatsApp's and Meta's Terms of Service, applicable data-protection laws (GDPR, CCPA), and platform policies in your jurisdiction. This actor is not affiliated with or endorsed by WhatsApp or Meta.

### SEO Keywords

whatsapp channel scraper, whatsapp channel search, search whatsapp channels, whatsapp channel finder, find whatsapp channels, whatsapp channel data, whatsapp channel followers, scrape whatsapp channel, whatsapp channel metadata, whatsapp group scraper, whatsapp channel directory, whatsapp channel by keyword, whatsapp channel lookup, whatsapp channel export, whatsapp channel analytics, discover whatsapp channels, whatsapp channel list, extract whatsapp channel info, whatsapp osint, whatsapp channel followers count

# Actor input Schema

## `queries` (type: `array`):

One search per line, e.g. `crypto trading`, `football news`, `job alerts india`.

## `startUrls` (type: `array`):

Direct channel pages (`https://whatsapp.com/channel/{id}`) or group invite links (`https://chat.whatsapp.com/{code}`) to scrape in addition to (or instead of) searches.

## `maxChannelsPerQuery` (type: `integer`):

Cap on how many channels a single search query can return.

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

Hard cap on the number of channels/groups scraped in this run.

## `maxConcurrency` (type: `integer`):

Maximum number of WhatsApp pages processed in parallel.

## `minConcurrency` (type: `integer`):

Minimum number of pages processed in parallel.

## `maxRequestRetries` (type: `integer`):

Number of retries before a failed request is given up.

## `proxy` (type: `object`):

WhatsApp's public pages need no proxy. For large batches of search queries, a residential proxy spreads the search-engine load and avoids rate limits.

## Actor input object example

```json
{
  "queries": [
    "crypto trading"
  ],
  "startUrls": [],
  "maxChannelsPerQuery": 30,
  "maxItems": 1000,
  "maxConcurrency": 10,
  "minConcurrency": 1,
  "maxRequestRetries": 5,
  "proxy": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "queries": [
        "crypto trading"
    ],
    "startUrls": [],
    "proxy": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("memo23/whatsapp-channel-search").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 = {
    "queries": ["crypto trading"],
    "startUrls": [],
    "proxy": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("memo23/whatsapp-channel-search").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "queries": [
    "crypto trading"
  ],
  "startUrls": [],
  "proxy": {
    "useApifyProxy": false
  }
}' |
apify call memo23/whatsapp-channel-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=memo23/whatsapp-channel-search",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "WhatsApp Channel Search & Scraper",
        "description": "Search WhatsApp channels by keyword and scrape their public metadata — name, follower count, bio, and avatar. Also resolves direct channel links and group invite links. No WhatsApp account, API key, or login needed. JSON or CSV output.",
        "version": "0.0",
        "x-build-id": "eRXfgRlGMp3Y1VcsH"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/memo23~whatsapp-channel-search/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-memo23-whatsapp-channel-search",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/memo23~whatsapp-channel-search/runs": {
            "post": {
                "operationId": "runs-sync-memo23-whatsapp-channel-search",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/memo23~whatsapp-channel-search/run-sync": {
            "post": {
                "operationId": "run-sync-memo23-whatsapp-channel-search",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "queries": {
                        "title": "Search queries",
                        "type": "array",
                        "description": "One search per line, e.g. `crypto trading`, `football news`, `job alerts india`.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "startUrls": {
                        "title": "WhatsApp URLs",
                        "type": "array",
                        "description": "Direct channel pages (`https://whatsapp.com/channel/{id}`) or group invite links (`https://chat.whatsapp.com/{code}`) to scrape in addition to (or instead of) searches.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxChannelsPerQuery": {
                        "title": "Max channels per query",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Cap on how many channels a single search query can return.",
                        "default": 30
                    },
                    "maxItems": {
                        "title": "Maximum items to scrape",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Hard cap on the number of channels/groups scraped in this run.",
                        "default": 1000
                    },
                    "maxConcurrency": {
                        "title": "Max concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Maximum number of WhatsApp pages processed in parallel.",
                        "default": 10
                    },
                    "minConcurrency": {
                        "title": "Min concurrency",
                        "minimum": 1,
                        "type": "integer",
                        "description": "Minimum number of pages processed in parallel.",
                        "default": 1
                    },
                    "maxRequestRetries": {
                        "title": "Max request retries",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Number of retries before a failed request is given up.",
                        "default": 5
                    },
                    "proxy": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "WhatsApp's public pages need no proxy. For large batches of search queries, a residential proxy spreads the search-engine load and avoids rate limits.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
