WhatsApp Group Links Scraper & Category Directories avatar

WhatsApp Group Links Scraper & Category Directories

Pricing

Pay per usage

Go to Apify Store
WhatsApp Group Links Scraper & Category Directories

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

Scrapier

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

2

Monthly active users

11 days ago

Last modified

Share

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.

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
  • 🔀 linkFormat detection — 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

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 TypeExtracted FieldsPrimary Use Case
Directory listingtitle, groupUrl, claimedMemberCount, claimedMembersText, directorySite, groupCategory, linkFormat, url, discoverySource, scrapedAtBuild a topic-specific outreach list, ranked by claimed size, without writing a single keyword
Keyword-sourced mentionkeyword, platform, country, title, desc, url, groupUrl, linkFormat, discoverySource, scrapedAtTrack 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.

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.

  1. Open WhatsApp Group Links Scraper & Category Directories on the Apify Console.
  2. Pick a Collection Lane (linkSource): directory for category browsing, search_engine for keyword search, or both.
  3. 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).
  4. Click Start and watch rows land in the Output tab as they're collected.
  5. 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.

ParameterRequiredTypeDescriptionExample Value
linkSourceNostringCollection lane. Enum: directory (📂 Category directories), search_engine (🔎 Keyword search), both (🔀 Both lanes). Default directory."directory"
groupCategoryNostringDirectory 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"
maxGroupsPerCategoryNointegerCaps rows taken from each directory category before moving to the next. Minimum 1. Empty = no per-category cap. Default 15.15
minClaimedMembersNointegerKeep 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
maxGroupRecordsNointegerHard ceiling on rows written across both lanes combined. Minimum 1. Empty = no ceiling. Default 30.30
searchTermsNoarray of stringsKeyword-lane search terms, e.g. "marketing", "crypto jobs". One row per public post that advertises a group.["marketing", "jobs"]
socialNetworkNostringNetwork 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"
geoTargetNostringCountry 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"
proxyConfigurationNoobjectNetwork 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 groupCategory and claimedMemberCount to 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 groupUrl and title straight into a retrieval or outreach workflow as grounded context.
  • 🔬 OSINT and market researchers: compare discoverySource, groupCategory, and platform across 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 ApifyClient
client = 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.

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.

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.