Facebook Groups Scraper avatar

Facebook Groups Scraper

Pricing

$24.99/month + usage

Go to Apify Store
Facebook Groups Scraper

Facebook Groups Scraper

Monitor Facebook group activity automatically. Scrape posts, discussions, engagement stats, and media with clean, export-ready output. Perfect for social research, community insights, and large-scale data analysis.

Pricing

$24.99/month + usage

Rating

0.0

(0)

Developer

Scrapier

Scrapier

Maintained by Community

Actor stats

2

Bookmarked

26

Total users

0

Monthly active users

13 days ago

Last modified

Share

Facebook Groups Scraper — Extract Posts and Commenter Profiles

Facebook Groups Scraper pulls posts from any public Facebook group — text, author, publish date, permalink, attachments, and the full seven-type reaction breakdown (like, love, haha, wow, sad, angry, care) — plus the top comments on each post, complete with the commenter's own profile ID, profile picture, and comment permalink. Every response is structured JSON, ready to pass directly to an LLM, index into a vector store, or feed a monitoring pipeline. Point it at a group URL and start building your dataset today.

What is Facebook Groups Scraper?

Facebook Groups Scraper is an Apify Actor that reads the feed of one or more public Facebook groups and returns a normalized JSON record for every post it finds, including the poster's profile, the full reaction breakdown, and — unlike several comparable group scrapers — the identity of the people behind the top comments, not just a comment count. It runs logged-out by default: no Facebook account or login is required to scrape a public group, and the Actor automatically routes every request through Apify's residential proxy. An optional cookie string is available only as a fallback for groups where Facebook intermittently serves a login wall to logged-out visitors.

  • Post content — full post text, publish date, and direct permalink for every post
  • Author identity — the poster's profile ID, name, profile URL, and profile picture, attached to every post
  • Full reaction breakdown — like, love, haha, wow, sad, angry, and care counts per post, not just a combined total
  • Top comments with commenter profiles — up to two top comments per post, each carrying the commenter's profile ID, name, picture, and comment permalink
  • Attachments — photos and albums with full image URLs, dimensions, and OCR-derived captions
  • Query controls — feed sort order (viewOption), keyword and year text filters, and a date cutoff (onlyPostsNewerThan)

What data can you get with Facebook Groups Scraper?

Facebook Groups Scraper returns five categories of data on every run: posts, author profiles, engagement/reactions, top comments with commenter profiles, and attachments.

Result TypeExtracted FieldsPrimary Use Case
Group postsgroupTitle, text, date/time, url, id, legacyId, inputUrl, scrapedAtFeed archiving, content monitoring
Author profile (per post)user.id, user.name, user.profileUrl, user.profilePictureIdentifying who is posting, tracking active members
Reactions & engagementlikesCount, sharesCount, commentsCount, topReactionsCount, reactionLikeCount, reactionLoveCount, reactionHahaCount, reactionWowCount, reactionSadCount, reactionAngryCount, reactionCareCountEngagement analysis, spotting viral posts
Top comments with commenter profilestopComments[].commentUrl, id, feedbackId, date, text, profileUrl, profilePicture, profileId, profileName, likesCount, threadingDepthSentiment reading, identifying active commenters
Attachmentsattachments[].thumbnail, image.uri, image.height, image.width, ocrText, mediaset_token, urlMedia auditing, visual content indexing

Top comments with commenter profiles

Most post-level Facebook feed data stops at a comment count. Facebook Groups Scraper goes further: for every post it returns up to two top comments, and each comment carries the full identity of the person who wrote it — not just a name string, but their profile ID, profile picture URL, and a direct comment permalink, plus the comment's own like count and threading depth. This is what lets you go from "this post got 40 comments" to "these specific members are driving the conversation," which matters for community managers deciding who to engage and for researchers mapping influence inside a group. The topComments array sits inside every post record — no separate lookup or second run required.

"topComments": [
{
"commentUrl": "https://www.facebook.com/groups/cheapmealideas/permalink/1122334455/?comment_id=998877",
"id": "Y29tbWVudDoxMTIyMzM0NDU1XzE=",
"feedbackId": "ZmVlZGJhY2s6MTEyMjMzNDQ1NQ==",
"date": "2026-06-30T14:02:11.000Z",
"text": "This freezes really well, made a double batch last week",
"profileUrl": "https://www.facebook.com/jane.cook.582",
"profilePicture": "https://scontent.xx.fbcdn.net/v/t39.30808-1/jane_profile.jpg",
"profileId": "100004821093456",
"profileName": "Jane Cook",
"likesCount": "6",
"threadingDepth": 0
}
]

Attachments and media

Every photo and album attached to a post comes back as a structured object, not a bare link: a thumbnail URL, a full-resolution image object (URI, height, width), a stable media id, and — when Facebook supplied one — an ocrText field with the image's accessibility caption. Albums (mediaset_token) resolve to the shareable album URL. Enough to build a media pipeline — download originals at full resolution, or index ocrText — without a second scrape.

Why not build this yourself?

Meta's Graph API does not let a third party search or read the posts of an arbitrary public group — the Groups API only returns data for groups your own app already administers, so scraping the rendered feed is the only way to read a group you don't own. Building and maintaining that scraper yourself means absorbing three ongoing costs:

  • Query-surface volatility — Facebook's GraphQL feed query is identified by a doc_id embedded in obfuscated JavaScript bundles that change on every frontend deploy. This Actor extracts doc_id, node_id, and pagination cursors fresh from the group's HTML/JS on every run, with multiple fallback patterns for when Facebook renames the query.
  • Anti-bot escalation — logged-out requests are routinely redirected to a login wall or rejected with a CSRF error unless the request carries valid lsd/fb_dtsg tokens and a warmed guest session. The Actor detects the login wall explicitly, warms a guest session first, and reports the specific block reason (login wall, CSRF, rate limit) instead of returning an empty result silently.
  • Proxy cost — reliably reaching public group content at any volume requires residential IPs, not datacenter proxies. This Actor forces Apify's residential proxy group on every request and retries with a fresh IP when a group appears blocked.

Build it yourself if you need to control every request detail and have the ongoing capacity to track Facebook's frontend changes. Use Facebook Groups Scraper if you want group post data without maintaining that pipeline.

How to scrape Facebook groups with Facebook Groups Scraper?

  1. Open Facebook Groups Scraper on the Apify platform.
  2. Enter one or more public group URLs in startUrls — this is the only required field.
  3. Set the query controls you need: resultsLimit, viewOption (sort order), searchGroupKeyword / searchGroupYear (text filters), and onlyPostsNewerThan (date cutoff).
  4. Start the run — the Actor resolves each group's doc_id/node_id automatically and scrapes through Apify's residential proxy with no further setup.
  5. Download or stream results as JSON or CSV from the run's dataset.

Example input for a single group, newest posts first, capped at 50:

{
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"resultsLimit": 50,
"viewOption": "CHRONOLOGICAL"
}

How to run multiple queries in one job

startUrls accepts an array, so a single run can scrape several groups at once — resultsLimit applies as one shared cap across all of them combined, and the run stops as soon as that total is reached. The Actor processes each URL in the list sequentially, one group at a time, rather than in parallel; the Actor does not document a configurable concurrency setting for URL-level parallelism.

⬇️ Input

Facebook Groups Scraper takes one or more group URLs plus optional sort, filter, and date-cutoff controls. startUrls is the only required field.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayOne or more public Facebook group URLs. Only public groups are supported without login.["https://www.facebook.com/groups/cheapmealideas/"]
resultsLimitNointegerMaximum number of posts to collect across all group URLs combined (default 20, minimum 1). You are only charged per post row actually saved.50
viewOptionNostringFeed sort order: CHRONOLOGICAL (default), RECENT_ACTIVITY, TOP_POSTS, or CHRONOLOGICAL_LISTINGS (Buy/Sell groups)."RECENT_ACTIVITY"
searchGroupKeywordNostringKeep only posts whose text contains this keyword. Client-side filter on the already-scraped feed, not a Facebook search — short (1–2 letter) terms match more posts."a"
searchGroupYearNostringKeep only posts published in this year. Client-side filter; use together with the keyword filter above."2025"
onlyPostsNewerThanNostringStop scraping when posts are older than this date. Accepts an absolute date (YYYY-MM-DD) or a relative period (7 days, 2 weeks, 1 month, 1 year)."2025-01-15"
cookieStringNostring (secret)Cookie header from a logged-in browser session, used only if Facebook redirects logged-out visitors to a login page for the target group. Must include c_user and xs. Leave empty for logged-out scraping."c_user=100000...; xs=12%3A...; datr=..."

Example JSON input:

{
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"resultsLimit": 100,
"viewOption": "RECENT_ACTIVITY",
"searchGroupKeyword": "a",
"searchGroupYear": "2025",
"onlyPostsNewerThan": "2 months"
}

Common pitfall: searchGroupKeyword and searchGroupYear filter the feed after it has already been fetched logged-out — they are not a real Facebook search. Full-word keywords routinely match nothing in logged-out mode; the input schema itself recommends a one- or two-letter term for searchGroupKeyword to get usable results.

⬆️ Output

Every scraped post is pushed to the Actor's dataset as one normalized, typed JSON row with a consistent schema across runs — nested objects for the author, reactions, comments, and attachments, not flattened strings. The default dataset view shows a 20-column summary table; the full row (documented below) carries every field. Export from the Apify Console as JSON, CSV, Excel, or the other formats the platform supports.

Scraped results

[
{
"facebookUrl": "https://www.facebook.com/groups/cheapmealideas/",
"url": "https://www.facebook.com/groups/cheapmealideas/permalink/1122334455/",
"time": "2026-06-30T12:00:00.000Z",
"date": "2026-06-30T12:00:00.000Z",
"scrapedAt": "2026-07-26T09:15:42.000Z",
"user": {
"id": "100004821093456",
"name": "Jane Cook",
"profileUrl": "https://www.facebook.com/jane.cook.582",
"profilePicture": "https://scontent.xx.fbcdn.net/v/t39.30808-1/jane_profile.jpg"
},
"text": "Made a huge batch of this cheap lentil soup this weekend, recipe in comments!",
"topReactionsCount": 214,
"feedbackId": "ZmVlZGJhY2s6MTEyMjMzNDQ1NQ==",
"reactionLikeCount": 150,
"reactionLoveCount": 48,
"reactionHahaCount": 2,
"reactionWowCount": 1,
"reactionSadCount": 0,
"reactionAngryCount": 0,
"reactionCareCount": 13,
"id": "UG9zdDoxMTIyMzM0NDU1",
"legacyId": "1122334455",
"attachments": [
{
"thumbnail": "https://scontent.xx.fbcdn.net/v/t39.30808-6/soup_thumb.jpg",
"__typename": "Photo",
"is_playable": false,
"image": { "uri": "https://scontent.xx.fbcdn.net/v/t39.30808-6/soup_full.jpg", "height": 720, "width": 960 },
"id": "6541234567890",
"__isMedia": "Photo",
"photo_cix_screen": null,
"copyright_banner_info": null,
"owner": { "__typename": "User", "id": "100004821093456" },
"ocrText": "A bowl of orange lentil soup with bread on the side"
}
],
"likesCount": 214,
"sharesCount": 9,
"commentsCount": 37,
"topComments": [
{
"commentUrl": "https://www.facebook.com/groups/cheapmealideas/permalink/1122334455/?comment_id=998877",
"id": "Y29tbWVudDoxMTIyMzM0NDU1XzE=",
"feedbackId": "ZmVlZGJhY2s6OTk4ODc3",
"date": "2026-06-30T14:02:11.000Z",
"text": "This freezes really well, made a double batch last week",
"profileUrl": "https://www.facebook.com/mark.saves.money",
"profilePicture": "https://scontent.xx.fbcdn.net/v/t39.30808-1/mark_profile.jpg",
"profileId": "100009988776655",
"profileName": "Mark Reyes",
"likesCount": "6",
"threadingDepth": 0
}
],
"facebookId": "1234567890123456",
"groupTitle": "Cheap Meal Ideas",
"pageAdLibrary": { "is_business_page_active": false, "id": "1234567890123456" },
"inputUrl": "https://www.facebook.com/groups/cheapmealideas/"
},
{
"facebookUrl": "https://www.facebook.com/groups/cheapmealideas/",
"url": "https://www.facebook.com/groups/cheapmealideas/permalink/1122334488/",
"time": "2026-06-29T18:41:03.000Z",
"date": "2026-06-29T18:41:03.000Z",
"scrapedAt": "2026-07-26T09:15:44.000Z",
"user": {
"id": "100002233445566",
"name": "Priya Nair",
"profileUrl": "https://www.facebook.com/priya.nair.eats",
"profilePicture": "https://scontent.xx.fbcdn.net/v/t39.30808-1/priya_profile.jpg"
},
"text": "What's everyone's go-to $5 dinner this month?",
"topReactionsCount": 61,
"feedbackId": "ZmVlZGJhY2s6MTEyMjMzNDQ4OA==",
"reactionLikeCount": 40,
"reactionLoveCount": 12,
"reactionHahaCount": 3,
"reactionWowCount": 0,
"reactionSadCount": 0,
"reactionAngryCount": 0,
"reactionCareCount": 6,
"id": "UG9zdDoxMTIyMzM0NDg4",
"legacyId": "1122334488",
"attachments": [],
"likesCount": 61,
"sharesCount": 2,
"commentsCount": 84,
"topComments": [],
"facebookId": "1234567890123456",
"groupTitle": "Cheap Meal Ideas",
"pageAdLibrary": { "is_business_page_active": false, "id": "1234567890123456" },
"inputUrl": "https://www.facebook.com/groups/cheapmealideas/"
},
{
"facebookUrl": "https://www.facebook.com/groups/cheapmealideas/",
"url": "https://www.facebook.com/groups/cheapmealideas/permalink/1122334501/",
"time": "2026-06-28T08:05:57.000Z",
"date": "2026-06-28T08:05:57.000Z",
"scrapedAt": "2026-07-26T09:15:46.000Z",
"user": {
"id": "100007744551122",
"name": "Tom Wallace",
"profileUrl": "https://www.facebook.com/tom.wallace.budget",
"profilePicture": "https://scontent.xx.fbcdn.net/v/t39.30808-1/tom_profile.jpg"
},
"text": "Selling my slow cooker, barely used - see photo",
"topReactionsCount": 8,
"feedbackId": "ZmVlZGJhY2s6MTEyMjMzNDUwMQ==",
"reactionLikeCount": 7,
"reactionLoveCount": 1,
"reactionHahaCount": 0,
"reactionWowCount": 0,
"reactionSadCount": 0,
"reactionAngryCount": 0,
"reactionCareCount": 0,
"id": "UG9zdDoxMTIyMzM0NTAx",
"legacyId": "1122334501",
"attachments": [
{
"thumbnail": "https://scontent.xx.fbcdn.net/v/t39.30808-6/cooker_thumb.jpg",
"__typename": "Photo",
"is_playable": false,
"image": { "uri": "https://scontent.xx.fbcdn.net/v/t39.30808-6/cooker_full.jpg", "height": 900, "width": 1200 },
"id": "6541234567999",
"__isMedia": "Photo",
"photo_cix_screen": null,
"copyright_banner_info": null,
"owner": { "__typename": "User", "id": "100007744551122" },
"ocrText": "A slow cooker on a kitchen counter"
}
],
"likesCount": 8,
"sharesCount": 0,
"commentsCount": 3,
"topComments": [
{
"commentUrl": "https://www.facebook.com/groups/cheapmealideas/permalink/1122334501/?comment_id=112233",
"id": "Y29tbWVudDoxMTIyMzM0NTAxXzE=",
"feedbackId": "ZmVlZGJhY2s6MTEyMjMz",
"date": "2026-06-28T09:30:00.000Z",
"text": "Is this still available?",
"profileUrl": "https://www.facebook.com/anna.deals",
"profilePicture": "https://scontent.xx.fbcdn.net/v/t39.30808-1/anna_profile.jpg",
"profileId": "100003399887766",
"profileName": "Anna Blake",
"likesCount": "0",
"threadingDepth": 0
}
],
"facebookId": "1234567890123456",
"groupTitle": "Cheap Meal Ideas",
"pageAdLibrary": { "is_business_page_active": false, "id": "1234567890123456" },
"inputUrl": "https://www.facebook.com/groups/cheapmealideas/"
}
]

How can I use the data extracted with Facebook Groups Scraper?

  • Community and social media managers: pull topComments[].profileName and profileUrl to identify the members driving conversation on a post, and track reactionLikeCount through reactionCareCount to see which content actually resonates rather than relying on a single combined like count.
  • AI engineers and LLM developers: have an agent call the Actor with a group URL, receive structured JSON with text, user, and topComments already attached, and pass it straight into a model as grounded context — no separate comment-lookup step needed.
  • Market researchers: aggregate reactionLikeCountreactionCareCount and sharesCount across a group over repeated runs to track sentiment shifts and share-of-voice for a topic or brand mentioned in group discussions.

How do you monitor Facebook group engagement over time?

Monitoring, here, means running the same group URLs on a recurring schedule and diffing the engagement fields between runs rather than reading a single snapshot. Each run returns the same post by its stable id (and legacyId), so you can match a post across runs and watch likesCount, sharesCount, commentsCount, and the individual reactionLikeCount through reactionCareCount fields change as the post ages — a spike in reactionAngryCount or commentsCount between two runs is a concrete, diffable signal, not a guess.

A typical workflow: schedule a run across your tracked group URLs (for example, daily), pull the previous run's dataset via the Apify API, join both datasets on id, and compute the delta on commentsCount and the reaction fields for each matching post. Alert when a post crosses a delta threshold you define, or when a new post from a specific user.id appears. Because topComments is capped at two comments per post, treat it as a sample of the most visible commenters for each snapshot rather than a full comment history.

Facebook Groups Scraper does not include a built-in scheduler of its own, but every Apify Actor — including this one — can be attached to Apify's platform-level Schedule feature (cron-style, configured in the Apify Console or via the API) to run automatically on an interval; combine that with the Apify API's dataset endpoints to pull and diff each run's results.

Integrate Facebook Groups Scraper and automate your workflow

Facebook Groups Scraper works with any language or tool that can send an HTTP request to the Apify API.

REST API with Python

import requests
TOKEN = "<YOUR_APIFY_TOKEN>"
url = f"https://api.apify.com/v2/acts/scrapier~facebook-groups-scraper/run-sync-get-dataset-items"
payload = {
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"resultsLimit": 50,
}
resp = requests.post(url, params={"token": TOKEN}, json=payload, timeout=180)
posts = resp.json() # list of post records, as shown above
for post in posts:
print(post["user"]["name"], post["commentsCount"], len(post["topComments"]))

MCP for query-grounded AI agents

Facebook Groups Scraper can be exposed to an MCP-compatible agent through Apify's Actors MCP Server: run npx @apify/actors-mcp-server --tools scrapier/facebook-groups-scraper locally with an APIFY_TOKEN environment variable, or connect the hosted server at https://mcp.apify.com and authorize it via OAuth. Once registered, an agent (in Claude Desktop, Claude Code, Cursor, or another MCP client) can call the Actor as a tool, receive the JSON post data back, and ground its answer in live group content instead of stale training data.

Scheduled monitoring and delivery

There is no actor-specific webhook feature documented in this Actor's own configuration; instead, attach it to Apify's platform-level Schedule to trigger runs on an interval, and use the Apify API's run-finished webhooks or the dataset export endpoints to deliver results to your own storage or pipeline after each scheduled run.

Scraping publicly accessible Facebook group posts is generally lawful in the US — courts have held that accessing data a site makes available to any visitor, without circumventing an access barrier, does not violate the Computer Fraud and Abuse Act (hiQ Labs, Inc. v. LinkedIn Corp., 9th Cir., 2019). Facebook Groups Scraper returns only what a logged-out visitor to a public group already sees. Group posts and comments do contain personal data — names, pictures, profile IDs — so storing them at scale can fall under GDPR or CCPA depending on your jurisdiction. Periodic monitoring carries a different risk profile than training a model on personal data, and Facebook's Terms of Service separately restrict automated collection. Consult your legal team before any commercial use case involving bulk storage.

Frequently asked questions

Does Facebook Groups Scraper require a Facebook account or login?

No. Public groups are scraped logged-out through Apify's residential proxy by default. The optional cookieString input exists only as a fallback for the cases where Facebook intermittently redirects a logged-out visitor to a login page for an otherwise-public group.

How do I control which posts get scraped?

Use viewOption to change the feed's sort order (CHRONOLOGICAL, RECENT_ACTIVITY, TOP_POSTS, or CHRONOLOGICAL_LISTINGS for Buy/Sell groups), searchGroupKeyword/searchGroupYear to keep only posts matching a keyword or year, and onlyPostsNewerThan to stop scraping once posts fall outside your date window.

How does Facebook Groups Scraper handle Facebook's anti-bot measures?

It warms a guest session before the first request, detects Facebook's login wall explicitly by checking the final response URL and page markers, retries through Apify's residential proxy when a request looks blocked, and surfaces the specific reason (login wall, CSRF token failure, rate limit) in the run log rather than failing silently.

Does Facebook Groups Scraper extract commenter profiles?

Yes. The topComments array on every post includes each commenter's profileId, profileName, profileUrl, and profilePicture, alongside the comment's own text, date, likesCount, and permalink. It is capped at the two most prominent comments per post; posts with no comments return an empty topComments array.

How many results does Facebook Groups Scraper return per query?

resultsLimit defaults to 20 and has a minimum of 1, with no maximum enforced by the input schema — you set the cap. The Actor will keep paginating and retrying (up to an internal safety ceiling of 10 attempts) until it reaches your resultsLimit or the group's feed runs out of new posts to return.

Can Facebook Groups Scraper access private groups?

No. It is built for public groups scraped logged-out. The optional cookieString only helps when Facebook shows a login wall for a public group's own content — it does not grant access to a private or closed group the cookie's account is not already a member of.

How do I use Facebook Groups Scraper to monitor group engagement over time?

Schedule the same group URLs to run on an interval via Apify's Schedule feature, pull each run's dataset, match posts across runs by id, and compare commentsCount and the reaction fields (reactionLikeCount through reactionCareCount) to the previous run — alert when a post's delta crosses whatever threshold matters to you.

Does Facebook Groups Scraper work with Claude, ChatGPT, and AI agent frameworks?

Yes. It is callable as a plain HTTP endpoint from any agent framework, and it is also reachable through Apify's Actors MCP Server (npx @apify/actors-mcp-server --tools scrapier/facebook-groups-scraper, or the hosted https://mcp.apify.com server) for MCP-native clients such as Claude Desktop and Claude Code.

How does Facebook Groups Scraper compare to other Facebook group scrapers?

As observed on their public Apify Store listings on 2026-07-26: one comparable actor (whoareyouanas/facebook-group-scraper) returns top comments with the author's name and profile URL but not their profile ID, profile picture, or comment permalink; another (scrapio/facebook-groups-posts-scraper) returns a full reaction breakdown but explicitly states it does not export individual comment threads at all. Facebook Groups Scraper returns both the full reaction breakdown and top comments with the commenter's full profile identity in the same run.

Can I use Facebook Groups Scraper without managing proxies or Facebook credentials?

Yes. The Actor always routes requests through Apify's residential proxy automatically — there is no proxy configuration to supply. You only need to provide a group URL; a Facebook cookie is optional and only needed as a login-wall fallback.

Your feedback

Found a bug or a field that doesn't match what's documented here? Let us know through Scrapier's Apify Store support tab or issue tracker — reports like this go straight into the next update.