Facebook Groups Posts Scraper: with Post Analytics avatar

Facebook Groups Posts Scraper: with Post Analytics

Pricing

Pay per usage

Go to Apify Store
Facebook Groups Posts Scraper: with Post Analytics

Facebook Groups Posts Scraper: with Post Analytics

Facebook Groups Posts Scraper extracts posts from public Facebook groups, including text, images, videos, author details, timestamps, reactions, comments, and share counts. Ideal for community research, trend analysis, social listening, and automating structured Facebook group post data collection.

Pricing

Pay per usage

Rating

0.0

(0)

Developer

SimpleAPI

SimpleAPI

Maintained by Community

Actor stats

1

Bookmarked

7

Total users

0

Monthly active users

5 days ago

Last modified

Share

Facebook Group Scraper — Posts, Engagement and New-Post Flags

Track posts inside any public Facebook group and get back a clean JSON row per post: author, text, publish date, attachments, likes/comments counts, and — because this is a monitoring variant — an isNewPost flag that tells you whether a post is genuinely new since your last run. Community managers, brand-monitoring teams, and researchers use it to watch niche Facebook groups for keyword mentions, track posting activity over time, and feed downstream alerting or CRM pipelines without re-processing posts they've already seen.

What is Facebook Groups Posts Scraper: with Post Analytics?

Facebook Groups Posts Scraper: with Post Analytics is an Apify Actor that scrapes posts from one or more public Facebook groups and layers repeat-run monitoring on top: it remembers which post IDs it has already collected per group, filters by keyword and by absolute date range, and flags every row as new or previously-seen. No Facebook login or API key is required — it reads groups the way an unauthenticated browser would.

  • Monitor one or many groups by URL, username, or keyword, choosing which feed order to paginate (all orders, top posts, chronological, or recent activity)
  • Skip already-seen posts across scheduled runs with monitorMode, so a daily/hourly schedule only returns what's actually new
  • Filter posts by include/exclude keyword lists and by an absolute dateFrom/dateTo window, enforced on the actual output rows
  • Return each post's author, text, publish date, attachments, like/comment counts, and permalink
  • Optionally attach full-resolution photos with OCR text, one-time group profile metadata, and a bounded top-comments preview per post
  • Export results as JSON, CSV, Excel, or any format Apify's dataset API supports

What data can I extract with Facebook Groups Posts Scraper: with Post Analytics?

Each dataset row is a single Facebook group post, with monitoring flags and optional enrichment data attached.

FieldExample ValueUse Case
isNewPosttrueFilter to only genuinely new posts since the last scheduled run
facebookUrlhttps://www.facebook.com/groups/germtheory.vs.terraintheoryIdentify which group the post belongs to
idUzpfSTEwMDA3NzI2ODMyNTcyOTpWSzoyNjEzODczMzc4MjQ0MzYxNg==Stable post identifier for dedup and cross-run tracking
feedbackIdZmVlZGJhY2s6MjYxMzg3MzM3ODI0NDM2MTY=Internal reference used to fetch comments for this post
user{"id": "pfbid02...", "name": "Mary Farrar", "profileUrl": "...", "profilePic": "..."}Identify the post's author for attribution or outreach
date2026-02-18T23:15:41.000ZSort or filter posts by publish time
urlhttps://www.facebook.com/groups/.../posts/26138733782443616/Link back to the original post
textSwedish Dish cloths. I'm thinking about buying some...Run keyword search, sentiment, or topic analysis
matchedKeywords["vaccine"]See which keywordsInclude term(s) triggered a match
attachments[{"__typename": "Photo", "photo_image": {...}, "ocrText": ""}]Pull embedded photos, videos, or links from the post
likesCount12Gauge reaction volume on a post
commentsCount10Gauge discussion volume on a post
source_grouphttps://www.facebook.com/groups/germtheory.vs.terraintheoryGroup the row back to its source when monitoring several groups at once
groupProfilenull (or object when includeGroupProfile is on)Attach member count, privacy, and creation date to every post from that group
topCommentsnull (or array when maxComments > 0)Preview real top-level comments without a separate comments-scraper run

Post monitoring data

The fields that make this a "post analytics" variant rather than a one-off scrape are isNewPost and matchedKeywords. isNewPost is computed against a persistent, per-group list of post IDs stored in the Actor's key-value store: with monitorMode on, any post ID already seen on a prior run is dropped from the output entirely, so a scheduled run only returns the delta. With monitorMode off, every post is still returned but isNewPost still reports whether that ID has ever appeared in a prior run — useful for auditing without discarding anything. matchedKeywords lists which keywordsInclude terms matched a post's text, letting you route rows by topic downstream. This is per-post change detection, not an aggregate engagement score or trend computation — there is no roll-up, average, or ranking calculation anywhere in the pipeline.

Targeting data

targetGroups, keywordsInclude/keywordsExclude, and dateFrom/dateTo are the fields you filter and segment on. Group targeting accepts a full URL, a bare username, or a keyword, so you can monitor groups you already know or seed by name. Keyword filters narrow the feed to on-topic posts before they're pushed to the dataset. The absolute date window lets you scope a run to a specific reporting period (e.g. a campaign week) instead of re-scanning a group's entire history every time.

Why not build this yourself?

Facebook's Graph API does not expose arbitrary public group post data to third-party apps — Meta restricts Groups API access to a small set of approved use cases (for example, apps that manage a group the developer administers), so there is no general-purpose official endpoint for "read all public posts from any group." Building a scraper in-house means reverse-engineering Facebook's internal GraphQL feed queries, handling doc_id/cursor rotation as Facebook's web client changes, managing residential proxy rotation to avoid rate-limit soft-blocks, and building your own persistent dedup layer to avoid reprocessing the same posts on every run. This Actor already does that work: it resolves the GraphQL feed query per group, retries through Apify's residential proxy on rate limits, and persists a seen-post-ID store across runs so monitoring survives scheduled re-runs.

Use a self-built solution if you administer the group and only need your own group's data through Meta's approved tooling. Use this Actor when you need to monitor public groups you don't administer, across a schedule, without maintaining scraping infrastructure yourself.

How to use data extracted from Facebook?

Community managers monitoring brand or niche groups

Set targetGroups to the groups you watch, turn on monitorMode, and schedule the Actor to run daily. Add your brand or product terms to keywordsInclude to cut noise. Each run returns only posts with isNewPost: true that also matched your keywords, so you can route text, user.name, and url straight into a Slack alert or ticketing queue without re-reading posts you already triaged.

Agencies auditing multiple client groups

Run the Actor across a client's list of targetGroups on a recurring schedule and diff commentsCount/likesCount week over week per post to spot which posts are still gaining traction. Because source_group is on every row, one dataset can be split back out per client for a recurring activity report, without re-scraping groups the agency doesn't administer.

Market and community research

Combine feedOrder: "ALL" with a wide dateFrom/dateTo window to pull a representative sample of discussion in a niche community, then analyze text and attachments for recurring topics, complaints, or product mentions. matchedKeywords gives a fast first-pass filter before deeper text analysis.

AI agents and automated pipelines

Because output is structured JSON keyed by stable post id, an agent can call this Actor on a schedule, hold state on isNewPost, and feed only the delta into a RAG index or a lead-scoring pipeline — without re-embedding posts already indexed in a prior run.

🔼 Input sample

None of the 12 input parameters are required — every field has a sensible default or works when left empty.

ParameterRequiredTypeDescriptionExample Value
targetGroupsNoarrayFacebook group URLs, usernames, or keywords to monitor["https://www.facebook.com/groups/germtheory.vs.terraintheory"]
postLimitNointegerMaximum posts to collect per group per run (min 10, max 10000)50
feedOrderNostring (enum)Feed ordering to paginate: ALL, TOP_POSTS, CHRONOLOGICAL, RECENT_ACTIVITY"CHRONOLOGICAL"
monitorModeNobooleanSkip posts already seen on a prior run for that group (default false)true
keywordsIncludeNoarrayOnly keep posts containing at least one of these keywords (default [])["vaccine", "immune"]
keywordsExcludeNoarrayDrop posts containing any of these keywords (default [])["spam"]
dateFromNostringOnly keep posts published on/after this absolute date"2026-01-01"
dateToNostringOnly keep posts published on/before this absolute date"2026-12-31"
resolveFullMediaNobooleanReplace low-res photo previews with full-resolution image + OCR textfalse
includeGroupProfileNobooleanAttach one-time group profile metadata to every post from that groupfalse
maxCommentsNointegerMax real top-level comments to attach per post (0-50, default 0/off)5
proxyNoobjectProxy preferences (Apify RESIDENTIAL proxy is always forced internally){"useApifyProxy": false}
{
"targetGroups": ["https://www.facebook.com/groups/germtheory.vs.terraintheory"],
"postLimit": 50,
"feedOrder": "CHRONOLOGICAL",
"monitorMode": true,
"keywordsInclude": ["vaccine", "immune"],
"keywordsExclude": ["spam"],
"dateFrom": "2026-01-01",
"dateTo": "2026-12-31"
}

Common pitfall: monitorMode only skips already-seen posts once a prior run has actually persisted a seen-post store for that group — the very first run against a new group always returns every post as isNewPost: true, since there is nothing to compare against yet. Also note postLimit has a floor of 10; values below that are raised to 10 internally rather than rejected.

🔽 Output sample

Output is typed, normalized JSON with a consistent schema across every run — the same 15 fields on every row, whether the run is a first scrape or a monitored re-run. Export as JSON, CSV, Excel, or any format available from Apify's dataset export options.

{
"isNewPost": true,
"facebookUrl": "https://www.facebook.com/groups/germtheory.vs.terraintheory",
"id": "UzpfSTEwMDA3NzI2ODMyNTcyOTpWSzoyNjEzODczMzc4MjQ0MzYxNg==",
"feedbackId": "ZmVlZGJhY2s6MjYxMzg3MzM3ODI0NDM2MTY=",
"user": {
"id": "pfbid02PHtjb98BvckjoMbtzEu5kZYJkUNUcCcdoGJRhmSZBRwbE1K6PPDNt1BKaBfKrfuYl",
"name": "Mary Farrar",
"profileUrl": "https://www.facebook.com/profile.php?id=pfbid02PHtjb98BvckjoMbtzEu5kZYJkUNUcCcdoGJRhmSZBRwbE1K6PPDNt1BKaBfKrfuYl",
"profilePic": "https://scontent.example.net/photo.jpg"
},
"date": "2026-02-18T23:15:41.000Z",
"url": "https://www.facebook.com/groups/germtheory.vs.terraintheory/posts/26138733782443616/",
"text": "Swedish Dish cloths. I'm thinking about buying some to replace paper towels...",
"matchedKeywords": ["vaccine"],
"attachments": [],
"likesCount": 0,
"commentsCount": 10,
"source_group": "https://www.facebook.com/groups/germtheory.vs.terraintheory",
"groupProfile": null,
"topComments": null
}

groupProfile is null unless includeGroupProfile is enabled, and topComments is null unless maxComments is greater than 0 — both fields are only ever populated with real, live-fetched data, never fabricated.

How do you filter and target specific groups/posts?

This Actor's targeting works on three axes: which groups to read, which posts to keep, and how much history to skip.

Group targeting. targetGroups accepts a full group URL, a bare username, or a keyword — all three normalize to the same group internally, so use whichever form you already have on hand. Add multiple entries to monitor several groups in one run; every row carries source_group so you can split results back out per group afterward.

Feed order vs. coverage. feedOrder controls which Facebook feed ordering gets paginated. CHRONOLOGICAL is the right choice for monitoring (newest posts first, so monitorMode catches new activity fastest). TOP_POSTS surfaces the most-engaged content instead of the newest, useful for a one-off "what's popular here" pull. ALL paginates through all three orders to maximize unique posts collected in a single run, at the cost of more requests per group.

Content filters. keywordsInclude and keywordsExclude are enforced on the actual post text before a row is ever pushed to the dataset — not applied after the fact. dateFrom/dateTo narrow the run to an absolute publish-date window.

Volume and recurrence. postLimit bounds how many posts are pulled per group per run (10-10000). monitorMode is the volume control for repeated runs: turn it on to receive only the delta since the last run instead of the full postLimit every time.

{ "targetGroups": ["mrbeast"], "feedOrder": "CHRONOLOGICAL", "monitorMode": true }
{ "targetGroups": ["https://www.facebook.com/groups/cheapmealideas/"], "keywordsInclude": ["recipe", "budget"], "keywordsExclude": ["giveaway"] }
{ "targetGroups": ["germtheory.vs.terraintheory"], "dateFrom": "2026-06-01", "dateTo": "2026-06-30", "postLimit": 200 }

▶️ Want to try other Facebook scrapers?

Scraper NameWhat it extracts
Facebook Groups Scraper: Sentiment & Lead AnalysisSame group-post scraping, plus optional AI-driven sentiment, emotion, topic, and lead-intent classification per post
Facebook Group Post With Top Contributors ScraperAggregates a group's posts and comments into a ranked leaderboard of top contributors with activity scores
Facebook Groups Search Scraper With Group Profile DetailsDiscovers groups by keyword and pulls each one's public profile (member/post stats, discoverability)
Facebook Group Profile ScraperPulls a single group's profile details — description, privacy, member count — without scraping its posts
Facebook Page Posts & Comments ScraperScrapes a public Facebook Page's posts and their full comment threads, including replies
Facebook Posts Scraper: Performance AnalyzerBenchmarks multiple Facebook Pages against each other with per-page engagement and share-of-voice rollups
Facebook Comments Scraper: Sentiment & Toxicity AnalysisScrapes comments (on posts or pages) with language detection and optional AI sentiment/toxicity scoring
Facebook Photos Scraper & High-Res Photo ExportResolves every resolution variant of a public photo plus real OCR/accessibility captions

How to extract Facebook data programmatically

This Actor runs as a standard Apify Actor: start a run with one JSON input payload over the Apify API and read results back from the run's dataset as structured JSON.

Python example

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run_input = {
"targetGroups": ["https://www.facebook.com/groups/cheapmealideas/"],
"postLimit": 50,
"monitorMode": True,
"keywordsInclude": ["recipe"],
}
run = client.actor("SimpleAPI/facebook-groups-posts-scraper-with-post-analytics").call(
run_input=run_input
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["isNewPost"], item["user"]["name"], item["text"][:80])

Export to spreadsheets or CRM

Apify's dataset export supports CSV directly from the run's dataset, so text, user.name, date, likesCount, commentsCount, and url map straight to spreadsheet columns for import into a CRM or lead-tracking sheet. Flatten the nested user object to user.name/user.profileUrl columns during export if your destination doesn't support nested JSON.

Scraping public Facebook group posts is generally permissible when limited to data a logged-out visitor could already see — this Actor only reads public groups, the same way an unauthenticated browser would. However, post author names, profile URLs, and profile pictures returned in the user field are personal data, so any storage or downstream use of this output falls under GDPR (if EU/UK individuals are involved) or CCPA (for California residents), which require a lawful basis for collecting and retaining that data. Facebook's own Terms of Service also restrict automated data collection, independent of privacy law. Consult legal counsel for commercial applications involving bulk storage of personal data.

❓ FAQ

How does the Actor know a post has been deleted or removed?

It doesn't track deletions directly — if a previously-seen post is no longer present in a group's live feed on a later run, it simply won't reappear in that run's output; there is no explicit "removed" flag.

Can I get comments along with the main post records?

Yes — set maxComments above 0 to attach a topComments array of real top-level comments per post, fetched from the post's own permalink page. Coverage depends on Facebook's live response for each post at request time; when no real comment data can be recovered, topComments is an empty list rather than fabricated content, and the lookup only runs on posts that already passed the keyword/date/seen filters.

How accurate is the engagement data?

likesCount and commentsCount reflect the numbers Facebook's feed reported at scrape time. Accuracy depends on Facebook's own reporting and can shift between runs as a post accumulates more reactions; re-run the Actor to get a fresher count rather than relying on a single snapshot for a live-tracking use case.

How many posts can I get per run?

postLimit bounds posts collected per group per run, from a minimum of 10 up to a maximum of 10,000 — set per your input, not a hidden platform cap.

What does "post analytics" actually compute?

It computes per-post monitoring state, not aggregate statistics: isNewPost (has this post ID been seen in a prior run for this group) and matchedKeywords (which include-terms matched). There is no engagement score, average, ranking, or trend calculation in this Actor — for a contributor leaderboard or aggregate benchmarking, see the related scrapers above.

How does Monitor Mode actually persist between runs?

It stores seen post IDs per group in the Actor's own key-value store, keyed by group URL. On the next scheduled run with monitorMode on, any post ID already in that store is dropped from the output before it's pushed to the dataset. If a run executes under Apify's limited-permissions run mode without prior access to that named store, monitoring falls back to a non-persistent store for that run only — the run still completes, but isNewPost is computed against an empty seen-set.

Does Facebook Groups Posts Scraper: with Post Analytics work with Claude, ChatGPT, and AI agent frameworks?

Yes, as an HTTP endpoint — any agent framework that can call the Apify API can start a run and read back the dataset, using the same input schema as a manual run.

Can I use this without a Facebook API key or developer account?

Yes. No Facebook account, login, API key, or developer app is required — the Actor reads public group data the way an unauthenticated browser does. You only need an Apify account to run the Actor itself.

How does this compare to other Facebook group scrapers?

Unlike a plain group-post scraper, this variant is built specifically for repeated/scheduled runs: it adds cross-run dedup (isNewPost), keyword/date filtering enforced on the output, and optional group-profile/full-media/comments enrichment layered on the same base extraction. It does not add AI sentiment classification (see Facebook Groups Scraper: Sentiment & Lead Analysis) or contributor-level aggregation (see Facebook Group Post With Top Contributors Scraper) — those are separate, purpose-built variants.

Conclusion

Facebook Groups Posts Scraper: with Post Analytics turns any public Facebook group into a monitorable feed: schedule it, and each run returns only the posts you haven't already seen, filtered by the keywords and date range you set. It's built for community managers, agencies, and researchers who need repeat coverage of the same groups without reprocessing old data or maintaining scraping infrastructure themselves. Start a run on Apify with your target group URLs to get your first dataset.