๐ Facebook Groups Posts Scraper Plus
Pricing
$14.99/month + usage
๐ Facebook Groups Posts Scraper Plus
Scrapes posts from multiple public Facebook groups, collecting text, images, authors, timestamps, reactions, comments, and post URLs. Ideal for community research, content analysis, trend tracking, and large-scale automated data extraction across many groups
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
1
Bookmarked
62
Total users
3
Monthly active users
8 days ago
Last modified
Categories
Share
Facebook Group Scraper โ Extract Posts, Reactions and Group Data
Facebook Groups Posts Scraper Plus turns any public Facebook group into a structured JSON dataset โ one row per post, with a full reaction breakdown, share and comment counts, the real numeric author ID, and group metadata attached to every row. Unlike scraping frameworks that hand you raw HTML to parse, this Actor returns typed JSON ready for a database, a spreadsheet, or an LLM context window with no cleanup step. It ships with five local filters (date window, include/exclude keywords, minimum engagement) and persistent cross-run deduplication, so a scheduled job only ever returns posts you haven't seen yet. The rest of this guide covers every input and output field byte-for-byte, and how teams actually wire the Actor into a pipeline.
๐งญ What Does Facebook Groups Posts Scraper Plus Do?
Facebook Groups Posts Scraper Plus collects posts published inside public Facebook groups โ text posts, photos, videos, links, shared posts, and Reels โ and returns each one as a structured record. It works without a Facebook account or login: the Actor fetches the group's public page anonymously through a proxy, extracts the tokens Facebook's own web client needs, and queries the same GraphQL endpoint the Groups feed uses in a browser.
- Accepts group URLs, usernames, or numeric group IDs as input, singly or in bulk
- Returns full post text, post type (
text/photo/video/link/shared/reel), and parsed hashtags - Breaks reactions down into like / love / care / haha / wow / sad / angry counts, plus total reactions, share count, and comment count
- Resolves and attaches the real numeric Facebook group ID and group title to every post
- Emits the author's real numeric Facebook user ID, name, profile URL, and profile picture
- Filters posts locally by date window, include/exclude keywords, and minimum engagement before anything is charged
- Remembers post IDs across runs (in a named key-value store) so scheduled runs return only new posts
โก Features & Capabilities
The Actor's feature set splits into what it extracts, how it holds up against comparable Facebook scrapers, and where it fits inside a broader Scrapio pipeline.
Core features
- Full reaction breakdown โ
reactions.like,reactions.love,reactions.care,reactions.haha,reactions.wow,reactions.sad,reactions.angry, pluslikesCount(total reactions) andtopReactionsCount(how many distinct reaction types appear on the post) - Real numeric author IDs โ
user.idis Facebook's genuine numeric user ID (or a realpfbidwhen that's what Facebook's payload returns), never a re-hashed or synthetic value - Group metadata on every row โ
groupId(resolved numeric group ID) andgroupTitletravel with each post, not just the group-level input - Engagement fields โ
sharesCountandcommentsCountper post (comment counts only โ see Limitations below) - Hashtag parsing โ
hashtagsis extracted fromtextwith a regex, deduplicated case-insensitively while preserving the original casing and first-seen order - Post-type and Reel detection โ
postTypeandisReelare derived from the GraphQL payload's__typenamefields and attachment shapes, not guessed from the URL alone - Structured attachments โ
attachmentsnormalizes Photo, Video, and Link media into a consistent per-type shape (photo_image/video/title+description) - Local filters before charging โ
onlyPostsNewerThan,onlyPostsOlderThan,keywords,excludeKeywords, andminEngagementare applied before a post is ever pushed to the dataset - Persistent cross-run dedup โ
dedupAcrossRunsstores seen post IDs in a named key-value store (fb-groups-posts-seen, capped at the most recent 50,000 IDs) so repeated scheduled runs only return new posts
How Facebook Groups Posts Scraper Plus compares to other Facebook group scrapers
| Feature | Facebook Groups Posts Scraper Plus | danek/facebook-groups-posts-scraper | api-empire/facebook-groups-posts-scraper |
|---|---|---|---|
| Output format | Typed JSON | Typed JSON | Typed JSON |
| Reaction breakdown by type | โ 7 types + total | โ single reactions_count total (as observed on the Apify Store on 2026-07-26) | โ not present in the published example output (as observed on the Apify Store on 2026-07-26) |
| Group ID + group title on every row | โ | โ not in the published output schema (as observed on the Apify Store on 2026-07-26) | โ facebookUrl only, no numeric group ID (as observed on the Apify Store on 2026-07-26) |
| Author ID format | Real numeric ID | Empty id field in the published example (as observed on the Apify Store on 2026-07-26) | Hashed pfbid... string in the published example (as observed on the Apify Store on 2026-07-26) |
| Hashtag extraction | โ | โ not documented | โ not documented |
| Date / keyword / engagement filters | โ 5 input parameters | โ not documented | Listed as a feature bullet ("Filter by date or number of posts") without parameter names shown (as observed on the Apify Store on 2026-07-26) |
| Cross-run deduplication | โ persistent key-value store | โ not documented | โ not documented |
If your use case is feeding structured data to an LLM or a pipeline, the output-format row rarely differs between these three โ the field-depth and author-ID-accuracy rows are the ones worth checking against your own sample run, since a hashed or empty author ID breaks any workflow that needs to identify or de-duplicate posters.
When another tool might suit you better
danek's Facebook Groups Scraper Lite is explicitly built to run on the Apify platform's lowest memory tier and is priced at a flat low monthly fee, which is a legitimate fit if all you need is post text, a total reaction count, and a comment count, and you don't need reaction-type breakdowns, group metadata, or built-in filters. If your workload is that minimal, its lighter schema may run cheaper for high-volume, low-detail monitoring.
Facebook Groups Posts Scraper Plus within the Scrapio data stack
Facebook Groups Posts Scraper Plus covers group post content and engagement. For a Facebook Page's own posts and comments, use Facebook Page Posts & Comments Scraper. For keyword-driven public post discovery across Facebook, use Facebook Posts Search Scraper Plus. For short-form video content, use Facebook Reels Scraper Plus. To resolve a Facebook URL into its numeric ID directly, use Facebook URL โ ID Plus.
Why do developers and data teams scrape Facebook groups?
๐ข Marketing and community teams
Community and brand teams feed group URLs into startUrls, set keywords to their brand or product names, and use minEngagement to surface only posts that are actually getting traction. The resulting text, reactions, sharesCount, and commentsCount fields go straight into a report or a Slack alert โ no manual scrolling through group feeds to catch when a product gets mentioned or complained about inside a niche community.
๐ AI training data and RAG indexing
The text field is the highest-information field for both use cases: it's the raw, unstructured discussion content that group members actually wrote. For RAG enrichment, indexing text alongside groupTitle and date lets an agent answer "what is this community saying about X, and when" with source-grounded context. For training data, postType, hashtags, and the reactions breakdown give consistent, typed structure across every record โ no HTML parsing or field-name drift between runs, since the schema is fixed by this Actor rather than by Facebook's front end.
๐ฑ Competitive and market intelligence
Point the Actor at a competitor-run or industry group and track sharesCount and the reactions breakdown over successive scheduled runs to see which posts and topics are actually spreading, rather than just getting posted. Because dedupAcrossRuns skips posts you've already collected, a weekly schedule naturally builds a time series of new activity per group without re-processing old posts.
๐ฌ Research and academic use
Public Facebook group discussions are a recognized source for social and market research datasets โ discourse analysis, misinformation studies, community-dynamics research. This Actor returns only what is already publicly visible in a group's feed; it does not access private groups, and it does not attempt to bypass a login or consent wall if one is presented.
๐ฅ Product and SaaS development
Teams building monitoring dashboards, lead-enrichment tools, or community-analytics products can run this Actor on a schedule and treat its dataset as an ingestion source: groupId and postUrl provide stable keys for deduplication and joins, while user.id gives a consistent identifier for building an author-level rollup across posts.
Input Parameters
Every parameter below is read directly from .actor/actor.json. Only startUrls is required.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | Facebook group URLs, usernames, or numeric group IDs. Accepts single or bulk input. | ["https://www.facebook.com/groups/cheapmealideas/"] |
maxPosts | No | integer | Maximum posts to collect per group. Minimum 10, maximum 10000, default 10. | 50 |
sortBy | No | string | Post ordering. Enum: ALL (combines all three sort orders for maximum coverage โ default), TOP_POSTS (most-engaged first), CHRONOLOGICAL (newest first), RECENT_ACTIVITY (latest comments/reactions first). | "ALL" |
onlyPostsNewerThan | No | string | Keep only posts published after this date. Absolute (2026-01-01) or relative ("7 days", "2 weeks", "1 month"). Empty disables the filter. | "7 days" |
onlyPostsOlderThan | No | string | Keep only posts published before this date. Same absolute/relative format as above. Combine with onlyPostsNewerThan for a window. | "2026-06-01" |
keywords | No | array | Keep only posts whose text contains at least one of these strings (case-insensitive substring match). Empty disables the filter. | ["recipe", "dinner"] |
excludeKeywords | No | array | Drop posts whose text contains any of these strings (case-insensitive substring match). Empty disables the filter. | ["spam", "giveaway"] |
minEngagement | No | integer | Keep only posts where likesCount + commentsCount + sharesCount is at least this value. Minimum 0, default 0 (disabled). | 10 |
dedupAcrossRuns | No | boolean | Remember post IDs from previous runs (in a named key-value store) and skip them, so repeated runs return only new posts. Default true. | true |
proxyConfiguration | No | object | Apify proxy settings. | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} |
{"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],"maxPosts": 50,"sortBy": "ALL","onlyPostsNewerThan": "7 days","keywords": ["recipe"],"excludeKeywords": ["giveaway"],"minEngagement": 10,"dedupAcrossRuns": true,"proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }}
Supported URL types and input formats
startUrls normalizes three input shapes before scraping:
- Full group URL โ
https://www.facebook.com/groups/cheapmealideas/is used as-is. - Bare username or slug โ
mrbeastis expanded tohttps://www.facebook.com/groups/mrbeast. - Numeric group ID โ a bare numeric string is expanded the same way (
https://www.facebook.com/groups/<id>), and the Actor's node-ID resolver reads the numeric ID straight out of that URL pattern with zero extra requests.
โ ๏ธ proxyConfiguration note: the Actor only reads proxyConfiguration.proxyUrls. If you supply your own proxy URLs there, the Actor tries them first and falls back to Apify Residential proxy (3 retries) if a custom proxy request fails. In every other case โ including the default proxyConfiguration and any other apifyProxyGroups selection โ the Actor always uses Apify Residential proxy with 3 retries per request. The useApifyProxy toggle and non-custom apifyProxyGroups values are accepted by the schema but do not change which proxy tier is used.
๐ฆ Output Format
Every collected post is pushed to the Apify dataset as one JSON row. The dataset's default view surfaces 20 of the row's fields (listed in .actor/actor.json's storages.dataset.views.default); the full row carries 22 keys, including two โ feedbackId and url โ that exist on every row but are not shown in the default table view.
Output for posts
{"type": "post","id": "UzpfSTEwMDAwMzI2Mzk5MTI5OTpWSzoyNzkzNzc0OTMzMjUyNDIwMw==","feedbackId": "ZmVlZGJhY2s6Mjc5Mzc3NDkzMzI1MjQyMDM=","groupId": "126966114029232","groupTitle": "Cheap Meal Ideas","groupUrl": "https://www.facebook.com/groups/cheapmealideas/","inputUrl": "https://www.facebook.com/groups/cheapmealideas/","postUrl": "https://www.facebook.com/groups/cheapmealideas/posts/27937749332524203/","url": "https://www.facebook.com/groups/cheapmealideas/posts/27937749332524203/?__cft__[0]=abc","user": {"id": "100003263991299","name": "Mark Gandman","profileUrl": "https://www.facebook.com/profile.php?id=100003263991299","profilePic": "https://scontent.xx.fbcdn.net/v/t39.30808-1/example.jpg"},"date": "2026-06-30T22:38:24.000Z","text": "If you only had $20 to buy groceries for the week, what's on your list?","postType": "text","isReel": false,"hashtags": [],"attachments": [],"likesCount": 59,"reactions": { "like": 57, "love": 2, "care": 0, "haha": 0, "wow": 0, "sad": 0, "angry": 0 },"topReactionsCount": 2,"sharesCount": 9,"commentsCount": 386,"scrapedAt": "2026-07-01T18:37:20.000Z"}
A post with a photo attachment carries a populated attachments array instead:
"attachments": [{"__typename": "Photo","photo_image": { "uri": "https://scontent.xx.fbcdn.net/photo.jpg", "height": 960, "width": 720 },"__isMedia": "Photo","url": "https://www.facebook.com/photo/?fbid=123456","id": "123456","ocrText": ""}]
Video attachments use {"__typename": "Video", "video": {"uri", "height", "width"}, ...}; link attachments use {"__typename": "Link", "url", "title", "description", "id"}.
Output for the embedded author and group objects
user is a nested object on every post row, not a separate dataset โ {id, name, profileUrl, profilePic}, with id as Facebook's real numeric user ID (or a genuine pfbid string, whichever the GraphQL payload actually carries โ this Actor never re-hashes or synthesizes the value). Group data is likewise embedded per row rather than fetched once: groupId is the resolved numeric group ID and groupTitle is the group's display name, both attached to every post from that group.
Note: the Actor returns
commentsCountper post โ a count, not the individual comment thread. It does not extract comment text, comment authors, or nested replies.
Schema stability and export options
Field names are fixed by this Actor's row-building code, not by Facebook's front end โ if Facebook changes its internal GraphQL response shape, the extraction functions that walk the payload are updated, but the output keys (likesCount, reactions, groupId, etc.) stay the same across runs. Results live in a standard Apify dataset: export to JSON, CSV, Excel, or XML directly from the Apify Console, or read programmatically via the Apify API or the apify-client SDK.
๐ก Facebook Groups Posts Scraper Plus Strategy Guide
๐ฏ Strategy 1: Real-time enrichment pipeline
Trigger a run whenever a new group needs monitoring (webhook, cron, or manual start), pass its URL in startUrls, and set minEngagement to filter noise before it ever reaches your system. Read groupId, text, reactions, sharesCount, and user.id off each pushed row and write them into your CRM, alerting tool, or analytics warehouse โ because filtering happens before Actor.push_data is called, you're only ever charged for rows you actually keep.
๐ฏ Strategy 2: Scheduled monitoring and alerting
Set up an Apify Schedule to re-run the Actor against the same startUrls on a recurring cadence, and leave dedupAcrossRuns at its default true. Because seen post IDs persist in the named key-value store fb-groups-posts-seen across runs, each scheduled execution's dataset contains only posts that appeared since the previous run โ diff the new rows' reactions and sharesCount against your last snapshot to alert on posts crossing an engagement threshold you define.
๐ฏ Strategy 3: Bulk dataset build
Pass a full list of group URLs, usernames, or numeric IDs in a single startUrls array and set maxPosts to the depth you need per group (up to the schema maximum of 10000). Each group is processed sequentially within one run, with a short pause between groups. Aggregate the resulting dataset to CSV or a database for research or model-training use โ the Actor does not document a concurrency or parallel-groups-per-run limit, so plan capacity around your own run duration rather than a published ceiling.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | Alerting on individual group activity | On-demand trigger per group | Streamed dataset rows, read as they land |
| Scheduled monitoring | Tracking new posts over time | Apify Schedule + dedupAcrossRuns | Incremental dataset per run |
| Bulk dataset build | Research or training datasets | One run, many startUrls | Full dataset exported to CSV/JSON |
Related Facebook Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| Facebook Page Posts & Comments Scraper | Posts and comments from a public Facebook Page |
| Facebook Posts Search Scraper Plus | Public Facebook posts matching a search keyword |
| Facebook Reels Scraper Plus | Facebook Reels and their engagement metrics |
| Facebook URL โ ID Plus | Resolves any Facebook URL to its numeric ID |
| Instagram Hashtag Stats Scraper Plus | Instagram posts, likes, and comments for a hashtag |
| Reddit Comment Scraper Plus | Comments and replies from a Reddit thread |
| TikTok Trending Videos Scraper Plus | Trending TikTok videos and engagement data |
How to integrate Facebook Groups Posts Scraper Plus with your stack
Facebook Groups Posts Scraper Plus works with any language or tool that can make an HTTP request, via the Apify API or its official client SDKs.
Python
from apify_client import ApifyClientimport csvclient = ApifyClient("<YOUR_APIFY_TOKEN>")run_input = {"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],"maxPosts": 100,"sortBy": "ALL","minEngagement": 5,"dedupAcrossRuns": True,}run = client.actor("scrapio/facebook-groups-posts-scraper-plus").call(run_input=run_input)rows = list(client.dataset(run["defaultDatasetId"]).iterate_items())with open("facebook_group_posts.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["id", "groupId", "groupTitle", "postUrl", "text","postType", "likesCount", "sharesCount", "commentsCount", "date",])writer.writeheader()for row in rows:writer.writerow({k: row.get(k) for k in writer.fieldnames})print(f"Saved {len(rows)} posts to facebook_group_posts.csv")
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('scrapio/facebook-groups-posts-scraper-plus').call({startUrls: ['https://www.facebook.com/groups/cheapmealideas/'],maxPosts: 100,sortBy: 'ALL',minEngagement: 5,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const post of items) {console.log(`${post.date} โ ${post.groupTitle}: ${post.text.slice(0, 80)}`);}
Async and scheduled pipelines
For large jobs, start the run with client.actor(...).start() instead of .call() and poll client.run(runId).get() for status, or configure an Apify Schedule in the Console to re-run automatically. The Actor does not offer webhook payload delivery of its own, but Apify's platform-level webhooks can fire on run completion so your pipeline is notified without polling.
๐ฏ Who Needs Facebook Groups Posts Scraper Plus? (Use Cases & Industries)
๐ข Marketing and community teams
Track when a brand, product, or campaign name is mentioned inside relevant Facebook groups by setting keywords, then route posts above a minEngagement threshold to a Slack channel or ticketing system using the text, postUrl, and reactions fields.
๐ AI/ML and data teams
Build a RAG index or fine-tuning dataset from group text content, keyed by groupId and timestamped by date, with postType and hashtags as structured metadata that requires no additional parsing.
๐ฑ Competitive intelligence analysts
Monitor an industry or competitor-adjacent group on a schedule, and use sharesCount and the reactions breakdown to identify which topics are actually gaining traction rather than just being posted.
๐ฌ Researchers
Collect public discourse from Facebook groups relevant to a social-science or market-research question. The Actor accesses only public group data and does not attempt to bypass a login or consent wall.
๐ฅ Product and lead-gen tool builders
Use user.id, user.name, and user.profileUrl as stable identifiers to build author-level rollups or enrichment records across the posts a scheduled run collects.
Is it legal to scrape Facebook groups?
Scraping publicly accessible Facebook group data is generally lawful in the United States; the main legal exposure is contractual (Facebook's Terms of Service), not criminal. In hiQ Labs, Inc. v. LinkedIn Corp., 938 F.3d 985 (9th Cir. 2019), the Ninth Circuit held that scraping data a website makes publicly accessible does not violate the Computer Fraud and Abuse Act. In Meta Platforms, Inc. v. Bright Data Ltd. (N.D. Cal., 2024), the court rejected several of Meta's claims over the scraping of Meta's own publicly accessible, logged-out pages, finding that a scraper not bound by an accepted account agreement is not automatically in breach of Facebook's Terms of Service.
Separately, violating a platform's Terms of Service is a civil contract matter between the user and the platform, not a criminal one โ but it can still carry consequences such as IP blocking or account termination for logged-in access.
Because this Actor returns posts that include author names, numeric user IDs, profile URLs, and profile pictures โ all personal data under GDPR and CCPA โ anyone storing or processing that output for commercial purposes should have a documented lawful basis for doing so in their jurisdiction.
Facebook Groups Posts Scraper Plus returns only publicly accessible data. What you do with that data is your responsibility โ consult legal counsel for commercial applications involving personal data.
โ Frequently asked questions
Does Facebook Groups Posts Scraper Plus work without a Facebook account?
Yes. The Actor never asks for Facebook login credentials or a session cookie. It fetches the group's public page anonymously through a proxy and queries Facebook's own GraphQL endpoint the same way an unauthenticated browser visit would.
How does Facebook Groups Posts Scraper Plus handle Facebook's anti-scraping measures?
It rotates proxy sessions on failure, retries with exponential backoff, and specifically detects Facebook's HTTP-200 "soft block" โ a response that returns status 200 but contains a GraphQL {"errors":[{"message":"Rate limit exceeded","code":1675004}]} payload instead of data. That soft block is treated as retryable and triggers a proxy rotation plus an extended backoff (up to 30 seconds) before the next attempt.
Can I run Facebook Groups Posts Scraper Plus at scale without getting blocked?
The Actor defaults every request (other than a user-supplied custom proxy) to Apify Residential proxy, retried up to 3 times per request, with proxy rotation between pages. No uptime or block-rate figure is published for this behavior โ treat proxy rotation and retry as mitigations, not a guarantee.
How fresh is the data Facebook Groups Posts Scraper Plus returns?
Posts are fetched live from Facebook's GraphQL API on every run โ the Actor does not cache post content. It does persist a small technical cache (doc_id, node_id, end_cursor per group) in a key-value store purely to speed up recovery on a future run if extraction fails; that cache holds no post data.
Which fields work best for AI training and RAG indexing?
For RAG, index text (the raw post content) alongside groupTitle and date for source grounding. For training data, postType, hashtags, and the reactions breakdown give consistent, typed structure across records โ every field returns as a typed primitive, array, or nested object with a fixed shape, requiring no normalization before use.
What happens if a group is private or its posts are removed?
If a group requires a login or presents a consent wall to the proxy session, the Actor cannot resolve the group's numeric ID and logs an error for that group rather than returning partial or fabricated data โ it returns zero posts for that startUrls entry. Posts that are deleted between the Actor's page fetches simply stop appearing on subsequent pages; the Actor does not retroactively detect or flag removed posts.
What happens to my personal data if I appear in the results?
Facebook Groups Posts Scraper Plus extracts only data a group already makes visible to the public โ author name, numeric ID, profile URL and picture, and post content. Storage, use, and any further processing of that personal data is the responsibility of whoever runs the Actor, under GDPR, CCPA, or the applicable law in their jurisdiction.
Does Facebook Groups Posts Scraper Plus work with Claude, ChatGPT, and other AI agent tools?
There is no dedicated MCP server for this Actor. It is callable as a standard HTTP endpoint by any agent framework via the Apify API โ every response is typed JSON, so no HTML parsing step is needed before passing results into an LLM context window.
How does Facebook Groups Posts Scraper Plus compare to other Facebook group scrapers?
As observed on the Apify Store on 2026-07-26, danek's Facebook Groups Scraper Lite is lighter-weight and cheaper for bare-minimum post/comment-count extraction, but its published schema doesn't include a reaction-type breakdown, group metadata, or built-in filters. api-empire's listing markets comment and engagement collection but its own published example output shows author IDs in the hashed pfbid format and no numeric group ID field. Facebook Groups Posts Scraper Plus trades some of that minimalism for a deeper, filterable, deduplicated schema.
Disclaimer
Facebook Groups Posts Scraper Plus extracts only publicly available data from Facebook. This tool is intended for lawful use cases only. Users are responsible for complying with Facebook's Terms of Service and applicable data protection laws in their jurisdiction.