๐ค Facebook Group Sentiment & Lead Analysis Scraper
Pricing
$19.99/month + usage
๐ค Facebook Group Sentiment & Lead Analysis Scraper
Extract data from public Facebook groups including posts, comments, reactions, and member insights. This Apify scraper helps you track discussions, analyze engagement, monitor trends, and gather valuable data for research, marketing, and community intelligence
Pricing
$19.99/month + usage
Rating
0.0
(0)
Developer
ScrapeEngine
Maintained by CommunityActor stats
2
Bookmarked
86
Total users
5
Monthly active users
25 days
Issues response
19 days ago
Last modified
Categories
Share
Facebook Groups Scraper โ Posts, Sentiment and Lead Intent
Facebook Groups Scraper: Sentiment & Lead Analysis pulls posts from public Facebook groups โ author, text, timestamp, and engagement counts โ and can optionally run each post through an LLM to add sentiment, emotion, topics, keywords, language, spam/quality scores, and a lead-intent label (buy, sell, hire, seeking recommendation, and more). It's built for lead-gen marketers hunting buying signals, agencies prospecting niche groups for clients, and researchers tracking group sentiment. AI enrichment is optional and key-gated, so a keyless run still returns the full post dataset, fields simply omitted.
What is Facebook Groups Scraper: Sentiment & Lead Analysis?
Facebook Groups Scraper: Sentiment & Lead Analysis is an Apify Actor that reads posts from one or more public Facebook groups and returns one structured JSON row per post โ author, text, timestamps, reactions, and engagement counts โ exportable as JSON, CSV, or Excel. No Facebook account or login is required: public groups are read logged-out over a residential proxy, and an optional session cookie only extends coverage where logged-out access falls short. Turn on AI enrichment and supply your own LLM API key, and every analyzed post gains sentiment, emotion, topic, keyword, language, spam/quality, and lead-intent fields from a real model call โ not a rule-based label.
- Discovers posts from any number of public Facebook groups via
groupUrlsToAnalyze, paginating each group's feed automatically until the requested post count is met. - Returns the identifying fields every post needs: author name/ID/profile URL, post text, permalink, group name and URL, and publish date.
- Optional AI layer (
enableAI) addssentiment,emotion,topics,keywords,language,spamScore,qualityScore,leadIntentandaiSummaryโ powered by your choice of 14 models across 7 LLM providers (Anthropic, OpenAI, Google, xAI, DeepSeek, Perplexity, Mistral). - Full engagement data: likes, shares, comments, total reactions, plus a per-type reaction breakdown (like/love/haha/wow/sad/angry/care).
- Client-side filters: a substring keyword filter, a year filter, and an absolute-or-relative "posts newer than" date window.
- Exports to JSON, CSV, or Excel straight from the Apify dataset, or is queried through the API.
What data can I extract with Facebook Groups Scraper: Sentiment & Lead Analysis?
Every dataset row is one Facebook group post. The Actor's row-builder (normalize_post in src/extractor.py) writes the base fields below on every run; the nine AI fields only populate when enableAI is on and a working key is supplied โ otherwise they're absent entirely.
| Field | Example value | Use case |
|---|---|---|
id | "1234567890123456" | Unique post node ID |
legacyId | "987654321098765" | Facebook's legacy post_id, used to build the comment permalink |
feedbackId | "ZmVlZGJhY2s6MTIz..." | Internal UFI feedback container ID |
url | "https://www.facebook.com/groups/cheapmealideas/posts/1234567890123456/" | Direct link back to the post |
facebookUrl / inputUrl | "https://www.facebook.com/groups/cheapmealideas/" | Source group URL, traced back to the input row |
date / time | "2026-06-18T14:22:10.000Z" | Publish timestamp (ISO 8601 UTC); both keys carry the same value |
scrapedAt | "2026-07-26T09:00:00.000Z" | When this row was captured, for freshness/time-series stamping |
text | "Looking to buy a second-hand slow cooker..." | Post body โ the field every filter and AI field is derived from |
user (.id, .name, .profileUrl, .profilePicture) | {"id":"100000123456789","name":"Jane Doe", ...} | Author identity, nested |
userProfileUrl / userProfilePicture | "https://www.facebook.com/jane.doe.9" | Same author fields flattened to the top level |
userIsVerified | null | Blue-check flag when Facebook exposes it; null (never guessed) when it doesn't |
groupTitle | "Cheap Meal Ideas" | Human-readable group name |
facebookId | "215566658234567" | Group's numeric ID |
attachments | [{"image":{"uri":"..."}, ...}] | Photo/album media attached to the post |
topComments | [{"text":"I've got one!","profileName":"Mike T.", ...}] | Up to 2 preview top-level comments per post |
likesCount / sharesCount / commentsCount | 23 / 0 / 8 | Core engagement counters |
topReactionsCount | 23 | Sum of every reaction type on the post |
reactionLikeCount, reactionLoveCount, reactionHahaCount, reactionWowCount, reactionSadCount, reactionAngryCount, reactionCareCount | 18, 5, 0, 0, 0, 0, 0 | Per-type reaction breakdown |
pageAdLibrary | {"is_business_page_active": false, "id": "215566658234567"} | Internal ad-library reference carried over from the base extractor |
sentiment (AI) | "positive" | One of positive, negative, neutral, mixed |
emotion (AI) | "anticipation" | Single dominant emotion |
topics (AI) | ["kitchen appliances","buy/sell"] | 1โ5 short topic labels |
keywords (AI) | ["buy","second-hand","slow cooker"] | 1โ8 salient keywords/phrases from the text |
language (AI) | "en" | ISO 639-1 language code |
spamScore (AI) | 4 | 0โ100, how promotional/spammy the post looks |
qualityScore (AI) | 72 | 0โ100, how substantive/useful the post is |
leadIntent (AI) | "buy" | One of buy, sell, hire, seeking_recommendation, asking_question, offering_service, job_seeking, none |
aiSummary (AI) | "Member wants to buy a used slow cooker." | One-sentence summary of the post |
Every dataset row pushed by the Actor is billed once as a row_result event (Actor.push_data(..., charged_event_name="row_result") in src/main.py); diagnostics like a login wall or rate limit are only written to the run's Log tab, never pushed as a separate, uncharged dataset row.
AI sentiment & lead-intent scoring
The nine AI fields are not a built-in classifier โ they come from a real call to whichever LLM you select in aiModel (Claude, GPT, Gemini, Grok, DeepSeek, Perplexity, or Mistral), using your own API key. Posts are batched (15 per call, src/ai_enricher.py) and sent with a structured-JSON prompt; the model's own judgment produces sentiment and leadIntent โ a member offering to sell resolves differently from one asking what to buy. When a batch fails to parse, every AI field for that post is set to null, never a guessed value. Filter a dataset export on leadIntent != "none" to isolate posts worth following up, or on qualityScore to drop low-substance posts first.
Targeting and filter data
Three fields control which posts get analyzed rather than which get returned already-labeled: intentKeywordFilter is a case-insensitive substring match against each post's raw text, run before AI enrichment (not a Facebook search โ short fragments like buy work best logged-out); analysisYear keeps only posts published in a given year; analyzePostsNewerThan accepts an absolute date (2026-01-01) or a relative window (30 days, 2 weeks). Combine them with feedScanOrder to pull CHRONOLOGICAL_LISTINGS from Buy/Sell groups specifically, or RECENT_ACTIVITY for a live sentiment pulse.
Why not build this yourself?
Meta's Graph API has not offered general-purpose Facebook Groups read access to third-party apps since the 2018 platform lockdown โ there is no public endpoint that lets an app request "every post in group X" for a group it doesn't administer, so there's no official-API path for arbitrary group monitoring and lead scoring to compare this Actor against.
Building this without a ready-made Actor means reverse-engineering Facebook's internal Comet GraphQL feed query (GroupsCometFeedRegularStoriesPaginationQuery): discovering a live doc_id for that query (Facebook rotates these with frontend releases), matching CSRF lsd/fb_dtsg tokens to every request, detecting and working around the login-wall redirect that logged-out sessions periodically hit, and rotating residential proxy IPs to avoid rate-limiting. This Actor already does all of that (src/app.py), plus the retry/backoff logic โ up to 10 attempts with capped exponential delay โ needed to keep pulling until the requested post count is met or the feed is genuinely exhausted. Layering sentiment and lead-intent scoring on top means also building a batching/prompt/parsing layer across multiple LLM providers with graceful null-on-failure handling, which this Actor's ai_enricher.py already implements for 7 providers.
Build it yourself if you need custom control over the GraphQL bootstrap or want to embed the scraping logic inside a larger in-house pipeline. Use this Actor if you want group post data with optional sentiment/lead scoring today, without maintaining scraper internals against Facebook's frontend changes.
How to use data extracted from Facebook?
Community and lead-gen marketers
Marketers building a lead list from group activity point groupUrlsToAnalyze at the relevant groups, turn on enableAI, and set feedScanOrder to CHRONOLOGICAL_LISTINGS for Buy/Sell-style groups or RECENT_ACTIVITY for general discussion groups. After the run, they filter the exported dataset on leadIntent (buy, seeking_recommendation, hire) and a qualityScore floor to drop spam, then hand the surviving rows โ user.name, userProfileUrl, text, aiSummary โ to outreach or a CRM import.
Agencies doing group prospecting
Agencies running this across several client-relevant niche groups on a recurring schedule set multiple entries in groupUrlsToAnalyze in one run, compare the leadIntent distribution and topics across groups, and give each client only the posts matching that client's intentKeywordFilter โ e.g., a moving-company client's agency filters for "moving" across five local groups in one pass instead of prospecting each manually.
Market research and intelligence
Researchers tracking group sentiment over time run the same groupUrlsToAnalyze list on a schedule with analyzePostsNewerThan set to a rolling window (e.g. 7 days), then aggregate sentiment, emotion and topics across exports to see whether a community's mood or dominant discussion themes are shifting week to week โ the same roll-up the Actor itself logs per run (sentiment counts, top topics, top lead intents).
AI agents and automated pipelines
Because output is structured JSON with leadIntent and sentiment already computed, an agent can call this Actor as a tool to answer "who in this group is looking to buy X this week" directly, or feed group discussion into a RAG index, without writing custom scraping or classification code.
๐ผ Input sample
All 11 input parameters are optional โ the schema declares no required fields, so an empty input still runs (it returns nothing without at least one group URL in groupUrlsToAnalyze).
| Parameter | Required | Type | Description | Example value |
|---|---|---|---|---|
groupUrlsToAnalyze | No | array | Public Facebook group URLs to analyze for sentiment/lead intent; add multiple in one run | ["https://www.facebook.com/groups/cheapmealideas/"] |
postsToAnalyze | No | integer (min 1) | Max posts to pull into the analysis across all groups | 25 |
feedScanOrder | No | string (enum) | Feed order: CHRONOLOGICAL, RECENT_ACTIVITY, TOP_POSTS, CHRONOLOGICAL_LISTINGS | "RECENT_ACTIVITY" |
intentKeywordFilter | No | string | Client-side substring filter over each post's text (not a Facebook search) | "buy" |
analysisYear | No | string | Keep only posts from a given year | "2024" |
analyzePostsNewerThan | No | string | Absolute (YYYY-MM-DD) or relative ("30 days", "2 weeks", "1 month", "1 year") date window | "30 days" |
enableAI | No | boolean (default false) | Turn on AI sentiment/lead-intent enrichment (needs a valid key) | true |
aiModel | No | string (enum, default "claude-haiku-4-5") | LLM to use; provider auto-detected from the model-name prefix | "claude-haiku-4-5" |
aiApiKey | No | string (secret) | API key for the selected provider; falls back to the provider's environment variable if blank | "sk-ant-..." |
proxyConfiguration | No | object | Proxy settings; the Actor always forces Apify Residential proxy regardless of this selection | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
facebookSessionCookie | No | string (secret) | Optional Facebook session cookie (needs at least c_user and xs); leave empty to scrape public groups logged-out | "c_user=100000...; xs=12%3A..." |
{"groupUrlsToAnalyze": ["https://www.facebook.com/groups/cheapmealideas/"],"postsToAnalyze": 25,"feedScanOrder": "RECENT_ACTIVITY","intentKeywordFilter": "buy","enableAI": true,"aiModel": "claude-haiku-4-5"}
Common pitfall: leaving postsToAnalyze blank does not mean "analyze as many as possible," despite the field's own description saying so. The schema pre-fills 10, and the Actor's fallback in src/main.py (_first(..., default=10)) applies that same value of 10 whenever the field arrives empty. Set an explicit number โ the field description itself suggests starting with 20โ50 to test โ if you want more than 10 posts pulled into the analysis.
๐ฝ Output sample
Each dataset item is one analyzed Facebook group post, typed and schema-stable. AI fields are present only when enableAI ran and produced a result for that post; a keyless run still returns every base field below with no AI keys attached. Export as JSON, CSV, or Excel from the Storage tab, or read it through the Apify API.
{"id": "1234567890123456","legacyId": "987654321098765","feedbackId": "ZmVlZGJhY2s6MTIzNDU2Nzg5MDEyMzQ1Ng==","url": "https://www.facebook.com/groups/cheapmealideas/posts/1234567890123456/","facebookUrl": "https://www.facebook.com/groups/cheapmealideas/","inputUrl": "https://www.facebook.com/groups/cheapmealideas/","date": "2026-06-18T14:22:10.000Z","time": "2026-06-18T14:22:10.000Z","scrapedAt": "2026-07-26T09:00:00.000Z","text": "Looking to buy a second-hand slow cooker, anyone selling one nearby?","user": {"id": "100000123456789","name": "Jane Doe","profileUrl": "https://www.facebook.com/jane.doe.9","profilePicture": "https://scontent.xx.fbcdn.net/v/jane_profile.jpg"},"userProfileUrl": "https://www.facebook.com/jane.doe.9","userProfilePicture": "https://scontent.xx.fbcdn.net/v/jane_profile.jpg","userIsVerified": null,"groupTitle": "Cheap Meal Ideas","facebookId": "215566658234567","attachments": [],"topComments": [{"commentUrl": "https://www.facebook.com/groups/cheapmealideas//permalink/1234567890123456/?comment_id=998877665544332","id": "Y29tbWVudDo5OTg4Nzc2NjU1NDQzMzI=","feedbackId": "ZmVlZGJhY2s6OTk4ODc3NjY1NTQ0MzMy","date": "2026-06-18T15:03:00.000Z","text": "I've got one, message me!","profileUrl": "https://www.facebook.com/mike.t.98","profilePicture": "https://scontent.xx.fbcdn.net/v/mike_profile.jpg","profileId": "100000987654321","profileName": "Mike T.","likesCount": "3","threadingDepth": 0}],"likesCount": 23,"sharesCount": 0,"commentsCount": 8,"topReactionsCount": 23,"reactionLikeCount": 18,"reactionLoveCount": 5,"reactionHahaCount": 0,"reactionWowCount": 0,"reactionSadCount": 0,"reactionAngryCount": 0,"reactionCareCount": 0,"pageAdLibrary": { "is_business_page_active": false, "id": "215566658234567" },"sentiment": "positive","emotion": "anticipation","topics": ["kitchen appliances", "buy/sell"],"keywords": ["buy", "second-hand", "slow cooker"],"language": "en","spamScore": 4,"qualityScore": 72,"leadIntent": "buy","aiSummary": "Member wants to buy a used slow cooker."}
How do you filter and target specific posts?
Targeting here works at two levels: which posts get pulled from a group's feed, and which of those get kept for analysis.
Category vs. free-text query. feedScanOrder is the closest thing to a category filter โ CHRONOLOGICAL_LISTINGS targets Buy/Sell-style group feeds specifically, TOP_POSTS favors the most-engaged content, RECENT_ACTIVITY surfaces live discussion, and CHRONOLOGICAL walks the feed oldest-first for complete coverage. intentKeywordFilter is the free-text side โ a case-insensitive substring match against each post's raw text, applied client-side before AI enrichment runs, so it's cheaper to filter first and analyze second.
Scope precision. analysisYear restricts to a single calendar year; analyzePostsNewerThan accepts an absolute date or a relative window (30 days, 2 weeks, 1 month, 1 year) for a rolling lookback. Add multiple entries to groupUrlsToAnalyze to cover several groups in one run.
Quality thresholds. There's no input-side minimum-score parameter โ quality and spam filtering happen after the run, using the AI-computed qualityScore and spamScore fields on the exported dataset, not a pre-scrape control.
Volume controls. postsToAnalyze caps the total posts pulled across all groups; the Actor paginates and retries automatically (up to 10 attempts, capped exponential backoff) until that count is met or the feed is genuinely exhausted.
// 1) Buy/Sell prospecting in a specific group{ "groupUrlsToAnalyze": ["https://www.facebook.com/groups/localbuysellswap/"], "feedScanOrder": "CHRONOLOGICAL_LISTINGS", "intentKeywordFilter": "selling", "enableAI": true }// 2) Recent sentiment pulse across two groups, on a budget model{ "groupUrlsToAnalyze": ["https://www.facebook.com/groups/cheapmealideas/", "https://www.facebook.com/groups/mealprepsunday/"], "feedScanOrder": "RECENT_ACTIVITY", "analyzePostsNewerThan": "7 days", "postsToAnalyze": 50, "enableAI": true, "aiModel": "gemini-2.0-flash-lite" }// 3) Historical year-over-year pull, base data only (no AI cost){ "groupUrlsToAnalyze": ["https://www.facebook.com/groups/cheapmealideas/"], "analysisYear": "2024", "postsToAnalyze": 200, "enableAI": false }
โถ๏ธ Want to try other Facebook scrapers?
| Scraper | What it extracts |
|---|---|
| Facebook Groups Posts Scraper: with Post Analytics | Public group posts tracked across repeated runs, flagging new-vs-seen posts with keyword include/exclude and date-range filters |
| Facebook Group Post With Top Contributors Scraper | Group posts aggregated into a ranked member leaderboard by post/comment count and reactions received |
| Facebook Comments Scraper: Sentiment & Toxicity Analysis | The same optional multi-provider AI layer (sentiment, emotion, spam, intent) applied to post comments instead of group posts, plus a toxicity score |
| Facebook Group Profile Scraper | Group-level metadata: description, creation date, activity, admins and moderators |
| Facebook Groups Search Scraper With Group Profile Details | Discovers groups by keyword and profiles each one's public About-page stats |
How to extract Facebook data programmatically
This Actor runs as a standard Apify Actor: one API call starts a run, one Bearer token authenticates it, and results come back as structured JSON from the dataset.
Python example
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("SimpleAPI/facebook-groups-scraper-sentiment-lead-analysis").call(run_input={"groupUrlsToAnalyze": ["https://www.facebook.com/groups/cheapmealideas/"],"postsToAnalyze": 25,"enableAI": True,"aiModel": "claude-haiku-4-5","aiApiKey": "<YOUR_LLM_API_KEY>",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["text"], item.get("sentiment"), item.get("leadIntent"))
MCP for AI agents
The Actor is reachable through Apify's Actors MCP Server, which exposes any Apify Actor as a callable tool. Run it locally with:
APIFY_TOKEN=<your_token> npx -y @apify/actors-mcp-server --actors SimpleAPI/facebook-groups-scraper-sentiment-lead-analysis
An agent can then call the Actor directly to answer questions like "who's posting buying signals in this group this week," without writing custom scraping or classification code. Compatible clients include Claude Desktop, Claude Code, and other MCP-aware agent frameworks.
Export to spreadsheets or CRM
Dataset exports (CSV/Excel) map directly to spreadsheet columns: user.name/userProfileUrl to a contact-name/link column, text and aiSummary to a notes field, leadIntent and sentiment to segment a CRM pipeline stage, and url/groupTitle to trace each lead back to its source post and group.
Is it legal to scrape Facebook groups?
Scraping public Facebook group posts is generally permitted where the content is visible without logging in โ this Actor reads only public groups by default, the same posts any visitor could see. Group posts, however, routinely contain personal data: author names, profile URLs, and free-text opinions tied to an identifiable person, so GDPR (for EU/UK data subjects) and CCPA (for California residents) govern how you store and use that data downstream, not just Facebook's own Terms of Service. Anyone collecting posts at scale needs a lawful basis for storing personal data (e.g. legitimate interest for market research) and must be able to honor deletion/opt-out requests. AI-derived fields like leadIntent and sentiment are inferences about a real person and should be handled with the same care as the underlying post text. Consult legal counsel for commercial applications involving bulk storage of personal data.
โ FAQ
What happens to a post that gets deleted after I've scraped it?
It simply won't appear in a later run โ the Actor doesn't track deletion history; each run reflects the group's live feed at request time, and scrapedAt marks when a specific row was captured. To detect that a post disappeared, compare id values across your own scheduled runs.
Can I get sentiment and lead-intent scoring along with the raw post data?
Yes โ turn on enableAI and supply a working API key for one of the 7 supported LLM providers (or set the matching environment variable); every analyzed post then carries sentiment, emotion, topics, keywords, language, spamScore, qualityScore, leadIntent and aiSummary alongside the base post fields. Posts are processed in batches of 15; a batch that fails to parse leaves those fields null rather than fabricated.
How accurate is the sentiment and lead-intent scoring?
It's only as accurate as the LLM you choose to run it โ sentiment, leadIntent and the other AI fields are real judgments from a live call to Claude/GPT/Gemini/Grok/DeepSeek/Perplexity/Mistral using your own key and model choice, not a proprietary trained classifier or a keyword rule. Cheaper mini/flash/haiku models cost less per post but may read ambiguous or sarcastic text less reliably than a larger model; there's no built-in accuracy benchmark, so spot-check a sample against a stronger model before committing to a cheap one at scale.
How many posts can I get per run?
postsToAnalyze accepts any integer of 1 or more, but leaving it blank does not mean unlimited โ the Actor falls back to 10 whenever the field arrives empty. Set an explicit higher number if you want more posts pulled across your groupUrlsToAnalyze list; pagination and retries continue automatically until that count is met or the feed is exhausted.
What's the most useful filter for finding buy/sell activity specifically?
feedScanOrder: "CHRONOLOGICAL_LISTINGS" targets a Buy/Sell-style group's listings feed directly, and pairing it with intentKeywordFilter (e.g. "selling" or "looking for") narrows further before AI enrichment even runs โ cheaper and faster than analyzing every post in the group.
Does this scraper work with Claude, ChatGPT, and AI agent frameworks?
Yes โ both as the analysis engine (via aiModel, using your own Claude/OpenAI/Gemini/etc. key) and as a callable tool: the Actor is reachable through Apify's Actors MCP Server (npx @apify/actors-mcp-server --actors SimpleAPI/facebook-groups-scraper-sentiment-lead-analysis) for MCP-aware clients, and callable as a standard HTTP/API endpoint by any other agent framework.
How does this compare to other Facebook group scrapers?
There's no independently verified competitor listing to cite here, so the honest comparison is against this Actor's own siblings: Facebook Groups Posts Scraper: with Post Analytics tracks the same kind of group posts across repeated runs for new-vs-seen monitoring, and Facebook Group Post With Top Contributors Scraper turns posts into a member leaderboard โ neither adds LLM-based sentiment or lead-intent scoring. This Actor is the one in the family built specifically for classifying post-level mood and intent.
Can I use this without a Facebook login or API key?
Yes for scraping โ public groups are read logged-out via a residential proxy, and facebookSessionCookie is optional. AI enrichment is separate: it needs your own API key for whichever LLM provider you pick in aiModel (or the matching environment variable), but the scraper itself never requires a Facebook account, app, or developer key.
What happens if I enable AI but don't provide a working key?
The run still completes and pushes every base post field โ the Actor logs a warning and simply skips enrichment, returning the same output as a keyless run with enableAI: false. Nothing is faked or estimated in place of a real key.
Conclusion
Facebook Groups Scraper: Sentiment & Lead Analysis turns any set of public Facebook group feeds into a structured dataset of posts and engagement counts, and โ when you switch on AI enrichment with your own LLM key โ sentiment, emotion, and lead-intent scoring per post. It's built for community and lead-gen marketers, prospecting agencies, and researchers who need repeatable, schema-stable group data rather than manual scrolling, with the AI layer staying fully optional so a keyless run always works. Add your group URLs and click Start on the Actor page to get your first dataset.