WhatsApp Group Links Scraper & Category Directories
Pricing
Pay per usage
WhatsApp Group Links Scraper & Category Directories
Find and extract public WhatsApp group invite links from websites, search results, and online directories. Collect group names, invite URLs, categories, and related details for research, community discovery, market analysis, and lead generation workflows.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Scrapier
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
2
Monthly active users
11 days ago
Last modified
Categories
Share
WhatsApp Group Links Scraper — Directories, Keywords & Member Counts
Find public WhatsApp group and channel invite links two ways in one Actor: browse curated category directories that already state a claimed member count, or search keyword mentions across eight social networks. Every response is structured JSON — ready to pass directly to an LLM, index into a vector store, or feed a lead-generation pipeline. Each row carries a discoverySource tag so directory listings and social-search mentions never get mixed together, and rows stream into your dataset the moment they're found. Point it at a category, a keyword list, or both, and let it build the list for you.
💬 What is WhatsApp Group Links Scraper & Category Directories?
It's a dual-lane Apify Actor for finding public WhatsApp invite links. The directory lane walks curated, already-categorized WhatsApp group directories and reads the claimed member count printed on each listing — no keyword required. The keyword lane does the classic lookup: it searches Google for public posts on a chosen social network that mention a chat.whatsapp.com link for your search terms. What sets the directory lane apart is claimedMemberCount — a real, sortable number parsed straight from each listing's own member badge, something a pure keyword-search scraper has no way to produce since search-result snippets don't carry a structured member figure. No WhatsApp account, login, or API key is required for either lane — both work against publicly reachable pages.
Key capabilities:
- 🗂️ Category directory lane across 19 topic categories (or an all-categories sweep), pulled from two directory sources
- 👥 Claimed member count parsed from each directory listing's badge text into a real number, with the raw text kept alongside it
- 🔎 Keyword lane across 8 social networks (Facebook, LinkedIn, Instagram, X/Twitter, YouTube, Reddit, Pinterest, TikTok)
- 🗺️ Geo targeting for the keyword lane using FIPS 10-4 country codes
- 🔀
linkFormatdetection — distinguishes modern bare-path links, legacy/invite/links, and WhatsApp channel links - 🧬 Backward-compatible legacy input names (
keywords,platform,country,limit) so older saved inputs keep working unchanged
📊 What data can you get with WhatsApp Group Links Scraper & Category Directories?
Both lanes write to the same 14-field row shape; a field that doesn't apply to a given lane is written as null rather than omitted.
| Result Type | Extracted Fields | Primary Use Case |
|---|---|---|
| Directory listing | title, groupUrl, claimedMemberCount, claimedMembersText, directorySite, groupCategory, linkFormat, url, discoverySource, scrapedAt | Build a topic-specific outreach list, ranked by claimed size, without writing a single keyword |
| Keyword-sourced mention | keyword, platform, country, title, desc, url, groupUrl, linkFormat, discoverySource, scrapedAt | Track where a topic or brand's WhatsApp groups get shared on a specific network and region |
Claimed member counts from category directories
Every directory listing prints a member badge like "500+ members" or "1.2k members". The Actor parses that text into a real integer (claimedMemberCount) while keeping the original text (claimedMembersText) alongside it, so nothing is silently invented — a listing that states no figure comes through as claimedMemberCount: null, never a fake 0. Setting minClaimedMembers filters directory rows to only those whose parsed figure meets the threshold; listings with no stated figure are dropped whenever this filter is active. This field is what lets you sort a category sweep by apparent group size instead of just link order:
{"title": "Crypto Trading Signals","groupUrl": ["https://chat.whatsapp.com/K7pQmXz2Rj0LhTnB8v3sYw"],"claimedMemberCount": 950,"claimedMembersText": "950+ members","groupCategory": "crypto","directorySite": "whatzgrouplink.com"}
Keyword-sourced mentions
The keyword lane runs a site:<platform> "chat.whatsapp.com" search on Google for each term in searchTerms, scans the organic results for a WhatsApp link in the title or snippet, and writes one row per matching public post. All terms in searchTerms are searched concurrently, and a single post that advertises more than one group is written with every detected link in the groupUrl array, not just the first.
🛠️ Why not build this yourself?
There's no official WhatsApp API for discovering public group directories or for searching what other sites and social posts say about a chat.whatsapp.com link — the WhatsApp Business Platform's Cloud API is for sending and receiving messages, not for discovery. Building this yourself means maintaining two moving targets: the directory sites' HTML/JSON structure (which changes without notice) and Google's search result markup (which changes constantly and blocks unrecognized traffic). This Actor already handles both: it retries failed requests with exponential backoff, and on repeated blocks it escalates the network route in stages — starting on your configured proxy, then a shared GOOGLE_SERP route, then a wide residential route — before giving up on that request. That escalation, plus the parsing and de-duplication logic, is the part that's tedious to keep working, not the initial script.
🧭 What is the difference between category directory browsing and keyword-based link scraping?
Category directory browsing means reading pages that are already organized into topics by their publisher — worldwide, with no query needed, and often carrying a claimed member count. Keyword-based scraping means running a live search query against a specific social network and collecting whatever public posts currently rank for it, which reflects recent activity but not any fixed categorization. Neither approach alone tells the full story: a directory can miss a group that only got shared informally on social media, and a keyword search returns nothing for a group nobody has posted about lately. This Actor returns both from a single run — set linkSource to "both" and every row still carries discoverySource so you always know which pass produced it.
🚀 How to scrape WhatsApp group links with this Actor
- Open WhatsApp Group Links Scraper & Category Directories on the Apify Console.
- Pick a Collection Lane (
linkSource):directoryfor category browsing,search_enginefor keyword search, orboth. - For the directory lane, set Directory Category (
groupCategory) and, optionally, Max Groups Per Category and Minimum Claimed Members. For the keyword lane, fill in Search Terms (searchTerms), Social Network (socialNetwork) and Geo Target (geoTarget). - Click Start and watch rows land in the Output tab as they're collected.
- Export the dataset as JSON, CSV, XML, Excel, or RSS, or pull it with the Apify API /
apify_client.
How to run multiple queries in one job
searchTerms accepts an array — each term is searched independently and every one is processed concurrently in the same run, so ["marketing", "crypto jobs", "real estate"] scans all three terms in parallel rather than one after another. For the directory lane, set groupCategory to "all" to sweep every one of the 19 categories in a single run instead of looping the Actor per category.
⬇️ Input
No parameter is required — leaving everything blank runs the directory lane across all categories with the schema's own defaults.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
linkSource | No | string | Collection lane. Enum: directory (📂 Category directories), search_engine (🔎 Keyword search), both (🔀 Both lanes). Default directory. | "directory" |
groupCategory | No | string | Directory category to walk. Enum: all, friendship, indian, pakistan, usa, students, education, earn_money, jobs, business, crypto, trading_forex, shopping, movies, gaming, cricket, sports, news, girls, social. Default all. | "crypto" |
maxGroupsPerCategory | No | integer | Caps rows taken from each directory category before moving to the next. Minimum 1. Empty = no per-category cap. Default 15. | 15 |
minClaimedMembers | No | integer | Keep only directory groups whose listing claims at least this many members; groups with no stated figure are dropped while this is set. Minimum 0. Never applies to keyword-lane rows. Default 0. | 300 |
maxGroupRecords | No | integer | Hard ceiling on rows written across both lanes combined. Minimum 1. Empty = no ceiling. Default 30. | 30 |
searchTerms | No | array of strings | Keyword-lane search terms, e.g. "marketing", "crypto jobs". One row per public post that advertises a group. | ["marketing", "jobs"] |
socialNetwork | No | string | Network the keyword lane searches. Enum: facebook.com (📘), linkedin.com (💼), instagram.com (📸), twitter.com (🐦), youtube.com (▶️), reddit.com (👽), pinterest.com (📌), tiktok.com (🎵). Default facebook.com. | "facebook.com" |
geoTarget | No | string | Country bias for the keyword lane, as a FIPS 10-4 code (not ISO 3166). Has no effect on the directory lane. Default us. Full 97-code list below. | "us" |
proxyConfiguration | No | object | Network route used while collecting. Default {"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]}. | see JSON example |
Example input:
{"linkSource": "both","groupCategory": "crypto","maxGroupsPerCategory": 15,"minClaimedMembers": 300,"maxGroupRecords": 50,"searchTerms": ["crypto trading", "forex signals"],"socialNetwork": "facebook.com","geoTarget": "us"}
⚠️ Common pitfall: geoTarget (and its legacy alias country) uses FIPS 10-4 codes, not ISO 3166-1 — gm means Germany and sp means Spain here, not Gambia or South Georgia. Double-check a code against the list above before assuming it matches the ISO code you already know. It also only biases the keyword lane; the directory lane is worldwide and ignores it entirely, even when linkSource is "both".
⬆️ Output
Every row is typed, normalized JSON with the same 14 keys regardless of which lane produced it — a field that doesn't apply to a lane is written as null, never dropped. Export the dataset as JSON, CSV, XML, Excel (XLSX), or RSS from the Console, or fetch it through the Apify API.
Scraped results
[{"keyword": null,"platform": null,"country": null,"title": "Crypto Trading Signals","desc": "crypto","url": "https://whatzgrouplink.com/crypto-whatsapp-group-links/","groupUrl": ["https://chat.whatsapp.com/K7pQmXz2Rj0LhTnB8v3sYw"],"discoverySource": "directory","directorySite": "whatzgrouplink.com","groupCategory": "crypto","claimedMembersText": "950+ members","claimedMemberCount": 950,"linkFormat": "modern_bare_path","scrapedAt": "2026-07-30T09:12:41Z"},{"keyword": null,"platform": null,"country": null,"title": "Forex Signals Hub","desc": "trading","url": "https://joinchatgroups.com/#trading","groupUrl": ["https://chat.whatsapp.com/invite/HqL9zT2mYvB4xR1cKpQ8sD"],"discoverySource": "directory","directorySite": "joinchatgroups.com","groupCategory": "trading_forex","claimedMembersText": null,"claimedMemberCount": null,"linkFormat": "legacy_invite_path","scrapedAt": "2026-07-30T09:12:55Z"},{"keyword": "crypto trading","platform": "facebook.com","country": "us","title": "Crypto Trading Community","desc": "Join our crypto trading group. Free signals daily. chat.whatsapp.com/9fT2xLmQpR7vB0kNsY3wCd","url": "https://www.facebook.com/groups/812345670923841/","groupUrl": ["https://chat.whatsapp.com/9fT2xLmQpR7vB0kNsY3wCd"],"discoverySource": "search_engine","directorySite": null,"groupCategory": null,"claimedMembersText": null,"claimedMemberCount": null,"linkFormat": "modern_bare_path","scrapedAt": "2026-07-30T09:13:20Z"}]
👥 How can I use the data extracted with this Actor?
- 🎯 Lead generation and growth marketers: filter directory rows by
groupCategoryandclaimedMemberCountto build an outreach list of the largest active groups in a niche before ever writing a keyword. - 💬 Community managers: run the keyword lane against your brand or product terms to find where your community is already being shared, without moderating every platform by hand.
- 🤖 AI engineers and LLM developers: an agent issues a run with a category or search terms, receives typed JSON back, and passes
groupUrlandtitlestraight into a retrieval or outreach workflow as grounded context. - 🔬 OSINT and market researchers: compare
discoverySource,groupCategory, andplatformacross a run to map how a topic or region organizes itself on WhatsApp.
📈 How do you monitor group activity over time?
Re-running the same category or keyword set on a schedule turns a one-off list into a monitoring feed. Diff groupUrl between two runs to see which invite links are new since the last pass, and diff claimedMemberCount on links that persist to see whether a directory has updated a listing's badge — a jump from "500+ members" to "1000+ members" is a real, comparable signal since the field is parsed the same way every run. Keep scrapedAt on every row so you can order changes chronologically. A typical loop: schedule a run across a fixed groupCategory (or searchTerms) set → compare the new dataset's groupUrl values against the previous run's → alert when a link disappears (likely dead) or a new one appears in a category you track. Set this up with an Apify schedule on this Actor, and use an Apify webhook to push the finished run's dataset to your own endpoint the moment it completes.
🔗 Integrate this Actor and automate your workflow
This Actor works with any language or tool that can send an HTTP request, through the Apify API and the apify-client SDKs.
REST API with Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("<ACTOR_ID>").call(run_input={"linkSource": "directory","groupCategory": "jobs","maxGroupRecords": 25,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["groupUrl"], item["claimedMemberCount"])
Scheduled monitoring and delivery
Set up a recurring Apify schedule to re-run this Actor with the same input on an interval, and attach an Apify webhook to the run to push the finished dataset to your own endpoint automatically, instead of polling the Console for new rows.
⚖️ Is it legal to scrape WhatsApp group links?
Yes — this Actor only collects data that is already publicly visible: directory pages anyone can open, and public social-media posts indexed by a search engine. It does not log into WhatsApp, join any group, or access anything behind a login. Because the core data here is public group and channel listings rather than personal profile data, the relevant framework is each source site's terms of service and database-rights law, not GDPR or CCPA — those attach to personal data, and group links, categories, and claimed member counts are not personal data about an individual. That said, keyword-lane snippets are pulled from public posts and may incidentally contain names or other text a poster shared publicly; treat that text with the same care you would any public-web scrape. Consult your legal team before commercial use involving bulk storage or redistribution of scraped data.
❓ Frequently asked questions
What countries can I target with geoTarget?
Any of the 97 FIPS 10-4 codes listed in the input section above, e.g. us, uk, in, br. It only biases the keyword lane's search — the directory lane is worldwide and ignores it.
What's the difference between the directory lane and the keyword lane?
The directory lane (linkSource: "directory") browses pages already organized by category and often carrying a claimed member count. The keyword lane (linkSource: "search_engine") searches a chosen social network for public posts mentioning your search terms. Set linkSource to "both" to run both in one job; discoverySource on each row tells you which lane found it.
How does this Actor handle blocking and anti-bot measures?
It retries a failing request up to 3 times with exponential backoff, then escalates the network route in stages — from your configured proxy, to a shared GOOGLE_SERP route, to a wide residential route — before moving on. This applies independently to the keyword lane's Google requests and the directory lane's page fetches.
Does this Actor extract claimed member counts?
Yes, on directory-lane rows only. claimedMemberCount is the number parsed from the listing's own badge (e.g. "500+ members" → 500), and claimedMembersText keeps the original text. A listing that states no figure produces claimedMemberCount: null — it is never estimated. Keyword-lane rows always carry null here since search snippets don't include a member badge.
How many results does this Actor return per run?
Up to maxGroupRecords total across both lanes combined (default 30, no default ceiling if left empty). Within that, the directory lane also respects maxGroupsPerCategory (default 15 per category) and stops pulling from a single directory source after 6 listing pages per category as a safety ceiling. The keyword lane scans up to 5 pages of Google results per search term (offsets 0, 10, 20, 30, 40) before moving to the next term.
Does my old input JSON still work?
Yes. keywords, platform, country, and limit are still accepted and map to searchTerms, socialNetwork, geoTarget, and maxGroupRecords respectively. If both the old and new field are filled for the same value, the new field wins.
How do I monitor new WhatsApp groups over time?
Schedule a repeated run across the same groupCategory or searchTerms set, then diff the new dataset's groupUrl values against the previous run's to spot new or disappeared links, and diff claimedMemberCount on links that persist. See the monitoring section above for the full loop.
Does this Actor work with Claude, ChatGPT, and AI agent frameworks?
It's callable as a plain HTTP endpoint through the Apify API by any agent framework that can make a request — an agent starts a run with a category or search terms, waits for the dataset, and uses the returned JSON as grounded context for its answer.
Can I use this Actor without managing proxies or WhatsApp credentials?
Yes. No WhatsApp account or login is required for either lane, and the default proxyConfiguration (Apify Proxy with the GOOGLE_SERP group) is enough to start — the Actor escalates its own network route automatically if a source stops responding.
Are legacy /invite/ links and channel links supported?
Yes. linkFormat on every row tells you which form the link came in: modern_bare_path for the current chat.whatsapp.com/<code> form, legacy_invite_path for the older chat.whatsapp.com/invite/<code> form, or channel for a whatsapp.com/channel/<id> link.
💬 Your feedback
Found a bug, a directory that stopped parsing, or a field you need that's missing? Open an issue from the Issues tab on this Actor's Apify Console page, or reach out through Scrapier's Apify Store profile — reports like these directly shape what gets fixed next.