WhatsApp Group Links Scraper & Precision Search Filters avatar

WhatsApp Group Links Scraper & Precision Search Filters

Pricing

from $2.99 / 1,000 results

Go to Apify Store
WhatsApp Group Links Scraper & Precision Search Filters

WhatsApp Group Links Scraper & Precision Search Filters

WhatsApp Group Links Scraper & Precision Search Filters extracts public WhatsApp group links using targeted filters, including keywords, categories, titles, descriptions, locations, and topics. Ideal for group discovery, community research, audience analysis, and market research.

Pricing

from $2.99 / 1,000 results

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

WhatsApp Group Links Scraper finds public WhatsApp group and channel invite links (chat.whatsapp.com URLs) indexed by Google across Facebook, Instagram, TikTok, LinkedIn, Twitter/X, YouTube, Pinterest and Reddit, then narrows the raw hits down with precision filters before anything reaches your dataset. Each row carries the invite link (groupUrl), the source page (url, title, desc), the search term (keyword), a duplicate flag (isDuplicateGroupUrl), and โ€” when you switch it on โ€” an AI topic category and scam-risk score. Growth marketers, community managers, and trust-and-safety researchers use it to build clean invite-link lists or measure how much of a topic's WhatsApp ecosystem is scam bait.


It is a Google-search-based discovery Actor: for every search term you give it, it runs a site:-restricted query against one social network for pages that mention chat.whatsapp.com, extracts every WhatsApp invite link on the page, and pushes one row per kept result. No WhatsApp, Google, or social-media login is required โ€” the Actor queries public search results through Apify Proxy and never authenticates to any of the platforms it scans.

  • Discovery by search term โ€” each entry in searchTerms is queried independently against the one network in socialSource, and every row is tagged with the exact term that produced it.
  • Core identifying fields โ€” groupUrl (the normalized invite link), url (source page), title, desc (snippet).
  • Secondary data type โ€” optional AI topic category and scam/spam-risk classification (aiTopicCategory, aiScamRiskLevel, aiScamRiskScore, aiScamSignals).
  • Geographic & temporal fields โ€” country/geoTarget region bias, resultFreshness window, scrapedAt collection timestamp.
  • Real filters โ€” excludeTerms, minSnippetLength, uniqueGroupLinksOnly, maxLinkRecords.
  • Export formats โ€” standard Apify dataset export (JSON, CSV, Excel/XLSX) from the Console, or pulled programmatically via the Apify API/CLI.

Every kept search result becomes one dataset row carrying the invite link, its source context, and (optionally) an AI risk read; one closing run_summary row per run adds the run-level tally.

Result row (rowType: "result")

FieldExample ValueUse Case
keyword"crypto trading"which search term produced this row
platform"facebook.com"which network was searched
country"us"region bias used for the query
title"Digital Marketing WhatsApp Group Links"title of the source page in the search results
desc"Join the best digital marketing WhatsApp groups..."snippet text the invite link was found in
url"https://www.facebook.com/groups/645308090352562/"source page the link was extracted from
groupUrl["https://chat.whatsapp.com/HsOmSeLn8vvCoII4Vds0UL"]normalized WhatsApp invite link(s) on this row
rowType"result""result" for a link row, "run_summary" for the closing row
groupUrlCount1how many invite links this result exposed
newGroupUrls["https://chat.whatsapp.com/HsOmSeLn8vvCoII4Vds0UL"]subset of groupUrl not already collected earlier in the run
isDuplicateGroupUrlfalsetrue when every link on the row was already collected earlier in the run
snippetLength168character count of desc โ€” what minSnippetLength filters on
scrapedAt"2026-07-30T10:14:52Z"ISO-8601 UTC collection timestamp
aiTopicCategory"business/marketing"topic bucket โ€” populated only when riskClassification is on
aiTopicConfidence0.82model confidence (0.0โ€“1.0) in aiTopicCategory
aiScamRiskLevel"low""low" / "medium" / "high" scam-risk verdict
aiScamRiskScore0.05scam-risk score, 0.0 (legitimate community) โ€“ 1.0 (near-certain scam)
aiScamSignals[]concrete red-flag phrases behind the score, empty when none found

Run summary row (rowType: "run_summary") โ€” appended once, at the end of the run, when appendRunSummary is on. Also stored as the RUN_SUMMARY record in the run's key-value store.

FieldExample ValueUse Case
rowType"run_summary"marks this as the one closing row per run
uniqueGroupLinks18distinct WhatsApp invite links collected across the whole run
totalResultRows20total result rows kept
duplicateRowsFlagged2rows whose links had all been seen earlier in the run
perPlatformCounts{"facebook.com": 20}kept-row count broken down by socialSource
perKeywordCounts{"digital marketing": 11, "crypto trading": 9}kept-row count broken down by search term
removedByExcludeTerms6results dropped for matching an excludeTerms word
removedBySnippetLength3results dropped for a snippet shorter than minSnippetLength
removedAsDuplicateLink0results dropped because uniqueGroupLinksOnly was on and the link was a repeat
scrapedAt"2026-07-30T10:16:10Z"when the summary was compiled

๐Ÿค– Topic & scam-risk signals

aiTopicCategory, aiTopicConfidence, aiScamRiskLevel, aiScamRiskScore and aiScamSignals are produced by one model call per kept result, using your own classifierModel/classifierApiKey. They are the decision-driving layer for trust-and-safety use: a low-effort "guaranteed daily profit" or "crypto airdrop" listing scores high on aiScamRiskScore with the matching phrase quoted in aiScamSignals, while a plain topical community scores low. All five fields stay null when riskClassification is off, when no provider key is available, or when the combined title+snippet text is too short to judge โ€” the classifier never fabricates a verdict from insufficient text.

๐ŸŽฏ Targeting & de-dup signals

country/geoTarget biases which market's search results come back; resultFreshness restricts to how recently the source page was indexed. isDuplicateGroupUrl, newGroupUrls and groupUrlCount are the de-duplication layer: the same popular group gets re-posted on dozens of pages, so these fields โ€” plus the uniqueGroupLinksOnly filter โ€” let you segment "every mention" from "only brand-new invite links."


๐Ÿ› ๏ธ Why not build this yourself?

WhatsApp does not publish a search or discovery API for finding public groups by keyword โ€” its official Business/Cloud APIs are for messaging within accounts and groups you already control, not for locating community invite links across the open web. Building this yourself means handling Google's result-page pagination and CAPTCHA/anti-bot blocking, a proxy-tier escalation ladder for when a route stops returning results, invite-link parsing that correctly handles both the modern chat.whatsapp.com/<code> form and the legacy .../invite/<code> form, run-level de-duplication, and freshness/junk filtering โ€” all of which this Actor already implements: a three-tier RouteManager (your configured route โ†’ GOOGLE_SERP โ†’ RESIDENTIAL) that escalates automatically on soft failures, up to 3 retries per page with exponential backoff, and a regex tuned to avoid collapsing every legacy-format link into the literal string "invite."


๐Ÿ“ฃ Growth marketers & community managers

Set searchTerms to your niche, socialSource to the network your audience actually posts invites on, add excludeTerms for the noise you don't want ("scam", "betting", "mlm"), set minSnippetLength to cut link-farm pages, and turn on uniqueGroupLinksOnly. The result is a live-filling dataset of groupUrl values you can export straight to CSV for outreach or a community directory, with no repeat invite links.

๐Ÿข Agencies & service providers

Run one job per client vertical and network, reading perKeywordCounts and perPlatformCounts from the run_summary row to show which terms and networks actually yield active-looking communities for that client, then repeat the same run monthly to track how the yield changes.

๐Ÿ” Trust & safety research

Turn on riskClassification and sweep a suspect topic (e.g. "crypto airdrop", "forex signals") across a network. aiScamRiskLevel, aiScamRiskScore and aiScamSignals let you quantify what fraction of that topic's WhatsApp-group ecosystem is scam bait versus a genuine community, without opening a single page by hand.

๐Ÿค– AI agents and automated pipelines

Because the Actor is a standard Apify run behind the Apify API, an agent can trigger it with a topic and network, then read groupUrl, aiTopicCategory and aiScamSignals back as structured JSON โ€” useful as a discovery tool ahead of a moderation pipeline, or as a RAG source answering "what public communities exist for X."


๐Ÿ”ผ Input sample

None of the fields below are required โ€” every one has a working default or fallback.

ParameterRequiredTypeDescriptionExample Value
searchTermsNoarrayTopics to search for, one term per line. Falls back to ["marketing", "jobs"] if left empty and keywords is also empty.["marketing", "jobs"]
socialSourceNostringNetwork the invite links are published on. One of: facebook.com, linkedin.com, instagram.com, twitter.com, youtube.com, reddit.com, pinterest.com, tiktok.com. Default facebook.com.facebook.com
geoTargetNostringCountry to bias results toward. One of 101 region codes (see full list below). Default us.us
maxLinkRecordsNointeger, minimum 1Stop after this many kept records, counted across all search terms after every filter is applied. See โš ๏ธ note below.25
excludeTermsNoarrayDrop any result whose title, snippet or source link mentions one of these words; the same words are pushed into the search query as negatives too. Default [].["scam", "betting", "adult"]
resultFreshnessNostring, default "any"One of any, day, week, month, year.week
minSnippetLengthNointeger, minimum 0, maximum 1000, default 0Reject a result whose snippet is shorter than this many characters.120
uniqueGroupLinksOnlyNoboolean, default falseKeep a result only when it introduces at least one invite link not already collected in this run.true
appendRunSummaryNoboolean, default trueAppend the closing run_summary row.true
riskClassificationNoboolean, default falseScore every kept result for topic + scam/spam risk.false
classifierModelNostring, default "claude-haiku-4-5"Model used when riskClassification is on โ€” see the full 20-model list below.claude-haiku-4-5
classifierApiKeyNostring (secret)Your own provider key. Falls back to ANTHROPIC_API_KEY / OPENAI_API_KEY / GEMINI_API_KEY / XAI_API_KEY / DEEPSEEK_API_KEY / PERPLEXITY_API_KEY / MISTRAL_API_KEY; with no key at all the classification columns stay null.โ€”
keywordsNoarrayLegacy alias for searchTerms. Used only when searchTerms is empty.["marketing", "jobs"]
platformNostringLegacy alias for socialSource. Same 8-value enum. Used only when socialSource is empty.facebook.com
countryNostringLegacy alias for geoTarget. Used only when geoTarget is empty. Unlike geoTarget, this is a free-text field with no enum check.us
limitNointeger, minimum 1Legacy alias for maxLinkRecords. Used only when maxLinkRecords is empty.10
proxyConfigurationNoobject, default {"useApifyProxy": true, "apifyProxyGroups": ["GOOGLE_SERP"]}Network route to the search results. The Actor escalates automatically on soft failures, so the default is safe to keep.โ€”

โš ๏ธ maxLinkRecords / limit left empty does not mean "no limit." The input description says leaving the field empty keeps everything found, but the Actor's own fallback sets it to 10 whenever both maxLinkRecords and limit are absent. If you want an uncapped run, you currently have to set a deliberately high number rather than leaving the field blank.

Example input

{
"searchTerms": ["crypto trading", "digital marketing"],
"socialSource": "facebook.com",
"geoTarget": "us",
"maxLinkRecords": 25,
"excludeTerms": ["scam", "betting"],
"resultFreshness": "month",
"minSnippetLength": 120,
"uniqueGroupLinksOnly": true,
"appendRunSummary": true,
"riskClassification": false
}

Common pitfall: socialSource (and its alias platform) takes a single network per run, not a list. To cover several networks, queue one run per network rather than trying to pass an array.


๐Ÿ”ฝ Output sample

Every row is typed, normalized JSON with a consistent schema, live-pushed to the dataset the moment a result is kept โ€” open the Output tab during a run and watch it fill. Export as JSON, CSV or Excel from the Console, or pull it programmatically over the Apify API.

[
{
"keyword": "digital marketing",
"platform": "facebook.com",
"country": "us",
"title": "Digital Marketing WhatsApp Group Links",
"desc": "Join the best digital marketing WhatsApp groups for 2026 ... chat.whatsapp.com/HsOmSeLn8vvCoII4Vds0UL ...",
"url": "https://www.facebook.com/groups/645308090352562/",
"groupUrl": ["https://chat.whatsapp.com/HsOmSeLn8vvCoII4Vds0UL"],
"rowType": "result",
"groupUrlCount": 1,
"newGroupUrls": ["https://chat.whatsapp.com/HsOmSeLn8vvCoII4Vds0UL"],
"isDuplicateGroupUrl": false,
"snippetLength": 168,
"scrapedAt": "2026-07-30T10:14:52Z",
"aiTopicCategory": null,
"aiTopicConfidence": null,
"aiScamRiskLevel": null,
"aiScamRiskScore": null,
"aiScamSignals": null
},
{
"rowType": "run_summary",
"uniqueGroupLinks": 18,
"totalResultRows": 20,
"duplicateRowsFlagged": 2,
"perPlatformCounts": { "facebook.com": 20 },
"perKeywordCounts": { "digital marketing": 11, "crypto trading": 9 },
"removedByExcludeTerms": 6,
"removedBySnippetLength": 3,
"removedAsDuplicateLink": 0,
"scrapedAt": "2026-07-30T10:16:10Z"
}
]

This Actor's discovery axis is a search term, not a category tree, so precision comes from four independent filters stacked on top of it:

  1. Search term vs source network. searchTerms is free text combined with a fixed site: restriction to the one network in socialSource โ€” only one network is scanned per run. Broaden coverage by adding more, more specific terms, not by expecting one run to cover several networks.
  2. Scope precision. geoTarget biases the underlying search to one country; resultFreshness (day/week/month/year) restricts to how recently the source page was indexed โ€” tighter freshness correlates with invite links that are still live, since dead groups stop getting freshly re-posted.
  3. Quality thresholds. excludeTerms is enforced twice โ€” pushed into the query as negatives and checked locally against title, snippet and URL โ€” while minSnippetLength rejects thin, context-free link-farm pages. uniqueGroupLinksOnly adds a third layer: invite-link-level de-duplication, not just source-page de-duplication.
  4. Volume controls. maxLinkRecords/limit caps the kept-record count across all terms combined. โš ๏ธ Per term, the Actor scans at most 5 result pages (up to 50 raw hits) before moving to the next term โ€” a fixed constant in the code, not an input you can raise. If a term dries up before your budget is reached, add more or broader terms rather than raising the budget alone.
{ "searchTerms": ["real estate investing"], "socialSource": "facebook.com", "geoTarget": "us", "excludeTerms": ["scam", "mlm"], "resultFreshness": "week", "minSnippetLength": 150, "uniqueGroupLinksOnly": true, "maxLinkRecords": 30 }
{ "searchTerms": ["crypto airdrop", "forex signals"], "socialSource": "twitter.com", "riskClassification": true, "classifierModel": "claude-haiku-4-5", "appendRunSummary": true }
{ "keywords": ["marketing"], "platform": "linkedin.com", "country": "uk", "limit": 15 }

โ–ถ๏ธ Want to try other WhatsApp scrapers?

Scraper NameWhat it extracts
Reddit API Scraper With Comment ThreadsReddit posts by keyword or URL, with full nested comment threads (author, score, permalink, depth)
Instagram Posts Scraper With Tagged Places & CoordinatesInstagram posts for a profile, including tagged-place names and coordinates
Instagram Story Details Scraper With Media DetailsInstagram story details with normalized video/image renditions per story
TikTok User Profile Scraper: Business LeadsTikTok profile and lead-contact fields by handle
LinkedIn Company Profile Scraper & Ad Library CreativesLinkedIn company firmographics plus public Ad Library creatives and transparency data
Google Images Scraper With Advanced FiltersGoogle Images results by search phrase, with filterable image metadata

The Actor runs as a standard Apify Actor: one authenticated call to the Apify API starts the run and returns structured JSON, no separate signup or credential flow beyond your Apify account.

๐Ÿ Python example

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("<ACTOR_ID>").call(run_input={
"searchTerms": ["crypto trading"],
"socialSource": "facebook.com",
"geoTarget": "us",
"excludeTerms": ["scam"],
"maxLinkRecords": 20,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
if item.get("rowType") != "result":
continue
print(item["keyword"], item["groupUrl"], item.get("aiScamRiskLevel"))

๐Ÿ“ค Export to spreadsheets or CRM

Export the dataset as CSV from the Console (or via the API's dataset-items CSV endpoint) and import directly: map groupUrl to your link column, keyword and platform to your source/campaign columns, and aiScamRiskLevel/aiTopicCategory to a triage column if classification was on. Filter out rowType == "run_summary" before importing, since that row has a different shape.


Yes โ€” this Actor only collects publicly visible search results and invite links that were already posted openly on public web pages; nothing is unlocked, logged into, or paywalled to get it. The records returned are business/community listings (group topics, source pages, invite links), not profiles of identifiable individuals, so the applicable framework is each source platform's terms of service rather than GDPR โ€” GDPR does not attach to this kind of public community-listing data. If you plan to join or message groups discovered this way in bulk, check anti-spam and unsolicited-messaging rules in your jurisdiction separately, since those govern the messaging, not the scraping. Consult legal counsel for commercial applications involving bulk outreach.


โ“ FAQ

No. The Actor extracts and normalizes invite links from search-result text; it never opens chat.whatsapp.com to confirm a group still accepts new members. resultFreshness only filters on how recently the source page was indexed, which correlates with โ€” but does not guarantee โ€” a still-joinable group. Validate links downstream before relying on them.

Can I get topic and scam-risk data along with the main records?

Yes โ€” set riskClassification to true and supply a classifierModel/classifierApiKey (or the matching environment variable). Each kept result gets one model call, adding aiTopicCategory, aiTopicConfidence, aiScamRiskLevel, aiScamRiskScore and aiScamSignals. Without a working key, or when the title+snippet text is too short to judge, those five fields stay null rather than guessing.

How accurate is the source and snippet data?

The Actor returns the title, snippet and link exactly as they appear in the search result at request time. Accuracy of the invite itself depends on whether the poster keeps it current โ€” the standard downstream step is to open a sample of links before a bulk campaign.

How many records can I get per run?

maxLinkRecords (or its alias limit) is any integer >= 1, applied across all search terms combined after every filter runs. But per search term, the Actor stops after at most 5 result pages (50 raw Google hits) regardless of your budget โ€” that ceiling is fixed in the code. Leaving the field empty falls back to a default of 10, not "unlimited," despite what the field's own description says.

Can I search more than one source network in a single run?

No. socialSource/platform takes exactly one network value per run โ€” it is a single string, not a list. Queue separate runs, one per network, to cover Facebook, LinkedIn, Instagram, Twitter/X, YouTube, Reddit, Pinterest and TikTok together.

Yes, in two ways. First, it's callable as a standard HTTP endpoint through the Apify API by any agent framework that can make an authenticated API call. Second, the optional riskClassification step itself runs on a model you choose from Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity or Mistral โ€” so the Actor already routes through Claude or ChatGPT if that's the classifierModel you pick.

Can I use it without a WhatsApp account, Google account, or API key?

Yes for the base scrape โ€” no WhatsApp account, Google account, or API key of any kind is required to run search, filtering, de-duplication or the run summary. The only feature that needs a key is riskClassification, and that key is your own model provider's, not WhatsApp's or Google's.

What happens to results removed by my filters โ€” am I charged for them?

No. Only rows pushed with the row_result charged event are billed โ€” that's every kept result row. Rows dropped by excludeTerms, minSnippetLength, or uniqueGroupLinksOnly never reach the dataset at all, and the closing run_summary row is pushed without a charged event. If you pull the dataset via the API and want only billed rows, filter on rowType == "result".


๐Ÿ Conclusion

WhatsApp Group Links Scraper turns a manual "search Google, click every result, copy the invite link" chore into a filtered, live-updating dataset: exclude terms, a freshness window, a junk-snippet floor, invite-link-level de-duplication, and an optional topic/scam-risk read, all backward-compatible with the original Actor's field names. It's built for anyone who needs a clean list of public WhatsApp communities โ€” growth marketers building lead lists, agencies auditing client verticals, and trust-and-safety researchers quantifying scam density โ€” without hand-checking every hit. Open it in the Apify Console, fill in your search terms and filters, and click Start.