Facebook Groups Scraper avatar

Facebook Groups Scraper

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Facebook Groups Scraper

Facebook Groups Scraper

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperX

ScraperX

Maintained by Community

Actor stats

0

Bookmarked

7

Total users

3

Monthly active users

3 days ago

Last modified

Share

Facebook Groups Scraper — Posts, Reactions, Top Comments & Media from Public Groups

Turn any public Facebook group into structured data. Paste group URLs and the Actor returns each post with its full text, author, permalink, timestamp, reaction breakdown (likes, loves, total), share and comment counts, photo/video attachments and the top comments on the post.

Add a date cut-off, a keyword and year filter, or one of four sort strategies to target exactly the posts you need. Optional cookie login is supported for deeper access — but the Actor works fine without it.


What you get

📝 Post❤️ Engagement💬 Comments & media
Post ID and legacy IDTotal reaction countUp to 2 top comments per post
Direct post permalinkLike countComment author, text and likes
Full post textLove countComment threading depth
Publication timestampShare countPhotos with URI + dimensions
Author name and IDComment countAccessibility caption (OCR-style text)
Group title and group IDFeedback object IDMedia set / album links

Key features

  • Four sorting strategies. CHRONOLOGICAL (newest first), RECENT_ACTIVITY (most active discussions), TOP_POSTS (highest engagement) and CHRONOLOGICAL_LISTINGS — the last one built specifically for buy/sell groups, where listings behave differently from discussion posts.
  • Reaction breakdown, not just a number. Separate reactionLikeCount and reactionLoveCount alongside the total, so you can tell polite approval from genuine enthusiasm.
  • Top comments included. Each post carries up to two of its most interesting top-level comments with author, text, like count and threading depth — enough context to understand a thread without a second scraper.
  • Date cut-off. onlyPostsNewerThan stops the run once posts get older than your boundary. Accepts absolute dates (2026-01-15) or plain language (7 days, 2 weeks, 1 month) — ideal for scheduled monitoring where you only want what is new.
  • Keyword + year filtering. Narrow a group's history to a specific year and search term.
  • Unlimited mode. Leave the post limit empty to collect everything the group feed will give you.
  • Optional cookie login. Supply a Facebook cookie string to reach content that is gated behind a login wall. Entirely optional — leave it empty and the Actor runs anonymously.
  • Residential proxy with auto-retry. Rotation and retry logic are built in, so long runs survive Facebook's rate limiting.
  • Bulk groups per run. Scrape many groups in a single job; every row records which group it came from.

Use cases

  • Community & audience research — understand what a niche actually talks about, with engagement numbers attached.
  • Lead generation — surface posts that signal buying intent and follow up through the public post.
  • Buy/sell group monitoring — use CHRONOLOGICAL_LISTINGS to track marketplace-style groups for new listings.
  • Brand & competitor monitoring — catch mentions of your product inside communities, including how people reply to them.
  • Content strategy & SEO — mine real questions and phrasing for content that ranks and resonates.
  • Trend detection — schedule a daily run with a 7 days cut-off and watch which topics accelerate.
  • Social listening & sentiment work — post text plus top comments gives you both the claim and the community's reaction.
  • Academic and market research — build reproducible datasets of public community discourse.

How it works

  1. You supply one or more public group URLs, a post limit and (optionally) filters.
  2. The Actor bootstraps each group — it resolves the group's internal node ID and the tokens needed to page the feed, straight from the public page.
  3. The feed is paginated in your chosen sort order, cursor by cursor, with randomised delays and up to 3 retries per request.
  4. Every post node is normalised into a flat record: text, author, timestamp, permalink, reactions, counts, attachments and top comments.
  5. Filters are applied — the date cut-off stops pagination early once posts fall outside your window.
  6. Rows stream into the dataset as they are extracted.

Quick start

  1. Copy the URL of a public Facebook group.
  2. Paste it into Facebook Group URLs — add more lines for more groups.
  3. Set Number of Posts to Scrape (start with 20–50; leave empty for everything).
  4. Pick a Post Sorting StrategyCHRONOLOGICAL is a good default.
  5. Click Start, then export the Output tab as CSV, Excel or JSON.

Minimal input

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

Input configuration

FieldTypeDefaultDescription
startUrlsarray— (required)One or more public Facebook group URLs. Private groups require authentication and are not supported anonymously.
resultsLimitinteger10Maximum posts to scrape per group. Leave empty to collect all available posts.
viewOptionstringCHRONOLOGICALCHRONOLOGICAL (newest first), RECENT_ACTIVITY (most recently active threads), TOP_POSTS (most engaged), CHRONOLOGICAL_LISTINGS (buy/sell groups).
onlyPostsNewerThanstringStop when posts are older than this. Absolute (2026-01-15) or relative (7 days, 2 weeks, 1 month).
searchGroupKeywordstringKeyword filter for posts inside the group. See the note below.
searchGroupYearstringRestrict to a year (e.g. 2026). Works best combined with a keyword.
proxyConfigurationobjectApify Proxy, RESIDENTIALResidential rotation with automatic retry. Recommended for anything at scale.
cookieStringstringOptional. A Facebook cookie header (must include at least c_user and xs) to run logged in. Use a dedicated secondary account — cookies grant access to that account.

About keyword search: Facebook's in-group search is heavily limited for logged-out visitors. Full words often return nothing. The reliable pattern is 1–2 letters combined with a year filter; for precise topic filtering, it is usually better to scrape broadly and filter the text column afterwards in your spreadsheet or code.

Note on limits: the post limit applies most predictably to the "new posts" (chronological) ordering.


Output data

One row per post.

FieldTypeDescription
idstringFacebook post node ID.
legacyIdstringLegacy numeric post ID.
urlstringDirect permalink to the post.
textstringFull post text.
timestringPublication timestamp (ISO, UTC).
userobject{ id, name } for the post author.
likesCountnumberTotal reactions.
reactionLikeCountnumber👍 Like reactions.
reactionLoveCountnumber❤️ Love reactions.
topReactionsCountnumberCombined top-reaction total.
commentsCountnumberComments on the post.
sharesCountnumberShares.
topCommentsarrayUp to 2 top-level comments: author, text, likesCount, threadingDepth.
attachmentsarrayPhotos and media with image.uri, image.width, image.height, id, thumbnail, ocrText (accessibility caption), owner info and album/media-set links.
groupTitlestringName of the group.
facebookIdstringGroup ID.
facebookUrl / inputUrlstringThe group URL this post came from.
feedbackIdstringFacebook's internal feedback object ID.
pageAdLibraryobjectAd Library reference for the group/page.

Example output

{
"id": "UzpfSTEwMDAwMTIzNDU2Nzg5MDoxMjM0NTY3ODkw",
"legacyId": "1234567890123456",
"url": "https://www.facebook.com/groups/cheapmealideas/posts/1234567890123456/",
"text": "Weekly shop came to £31 for four people. Full breakdown below 👇",
"time": "2026-08-06T07:14:52.000Z",
"user": { "id": "100001234567890", "name": "Jamie Example" },
"likesCount": 512,
"reactionLikeCount": 431,
"reactionLoveCount": 74,
"topReactionsCount": 505,
"commentsCount": 96,
"sharesCount": 23,
"topComments": [
{ "text": "This is genuinely useful, thank you!", "likesCount": "18", "threadingDepth": 0 }
],
"attachments": [
{
"__typename": "Photo",
"image": { "uri": "https://scontent.xx.fbcdn.net/…", "width": 1080, "height": 1440 },
"id": "9876543210",
"ocrText": "May be an image of text that says 'WEEKLY SHOP £31'"
}
],
"groupTitle": "Cheap Meal Ideas",
"facebookId": "123456789012345",
"inputUrl": "https://www.facebook.com/groups/cheapmealideas/"
}

Illustrative values — a live run returns current Facebook data.


Usage examples

Daily monitoring — only what is new

{
"startUrls": ["https://www.facebook.com/groups/yourniche/"],
"viewOption": "CHRONOLOGICAL",
"onlyPostsNewerThan": "1 day",
"resultsLimit": 500
}

Save as a Task, attach a daily Schedule, and deduplicate on id.

Best-performing content in a community

{
"startUrls": ["https://www.facebook.com/groups/yourniche/"],
"viewOption": "TOP_POSTS",
"resultsLimit": 300
}

Sort the export by likesCount and commentsCount.

Buy/sell group listings

{
"startUrls": ["https://www.facebook.com/groups/localbuysell/"],
"viewOption": "CHRONOLOGICAL_LISTINGS",
"onlyPostsNewerThan": "7 days",
"resultsLimit": 1000
}

Historical pull for a specific year

{
"startUrls": ["https://www.facebook.com/groups/yourniche/"],
"searchGroupKeyword": "a",
"searchGroupYear": "2025",
"resultsLimit": 500
}

Several groups in one run

{
"startUrls": [
"https://www.facebook.com/groups/groupone/",
"https://www.facebook.com/groups/grouptwo/",
"https://www.facebook.com/groups/groupthree/"
],
"resultsLimit": 200,
"viewOption": "RECENT_ACTIVITY"
}

Run it from your own code

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("scraperx/facebook-groups-scraper").call(run_input={
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"resultsLimit": 100,
"viewOption": "CHRONOLOGICAL",
"onlyPostsNewerThan": "30 days",
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["time"], post["user"]["name"], post["likesCount"], post["text"][:80])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });
const run = await client.actor('scraperx/facebook-groups-scraper').call({
startUrls: ['https://www.facebook.com/groups/cheapmealideas/'],
resultsLimit: 100,
viewOption: 'CHRONOLOGICAL',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL

curl -X POST "https://api.apify.com/v2/acts/scraperx~facebook-groups-scraper/runs?token=<YOUR_APIFY_API_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"startUrls":["https://www.facebook.com/groups/cheapmealideas/"],"resultsLimit":100}'

Integrations

Push posts to Google Sheets, Airtable, Slack, Make, Zapier, Google Drive or any endpoint via webhooks, and pair with Schedules for continuous community monitoring.


Pricing

Pay-per-event: a small Actor-start charge plus a charge per post row delivered to your dataset. You pay for the posts you get, not for run time. Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run.

Cost tip: combine onlyPostsNewerThan with a schedule so recurring runs only pay for genuinely new posts.


Limits & good to know

  • Public groups only without cookies. Private and closed groups require membership; the Actor does not bypass that.
  • In-group keyword search is limited for logged-out sessions. Prefer scraping broadly and filtering the text column, or use the 1–2 letter + year trick.
  • resultsLimit is per group, so five groups at 200 posts can yield 1,000 rows.
  • Facebook restricts how far back a public feed can be paged; very old posts may be unreachable regardless of your limit.
  • topComments returns up to 2 comments per post — it is context, not a full comment export.
  • Media URIs point at Facebook's CDN and expire; download assets promptly if you need to keep them.
  • If you use cookieString, use a dedicated secondary account: the cookie grants access to that account, and automated activity can get accounts restricted.
  • Default run options are 4 GB memory and a 1-hour timeout — raise the timeout for large multi-group runs.

FAQ

Do I need to log in? No. The Actor runs anonymously on public groups. The cookieString field is optional and only needed for content behind a login wall.

Can it scrape private groups? Not anonymously. Only public group content is accessible without membership.

Does it return comments? Yes — up to two top comments per post, with author, text, like count and threading depth, alongside the total comment count.

What is CHRONOLOGICAL_LISTINGS for? Buy/sell groups, where Facebook renders listings differently from ordinary discussion posts.

How do I only get new posts each day? Set onlyPostsNewerThan to 1 day (or 7 days) and schedule the run.

Why does keyword search return nothing? Facebook's logged-out group search barely works with full words. Use one or two letters plus a year, or filter the exported text column instead.

Can I scrape everything in a group? Leave resultsLimit empty to go as deep as Facebook's feed allows. Very old history may still be capped by Facebook.

Which export formats are supported? JSON, CSV, Excel (XLSX), XML and RSS. JSON keeps user, topComments and attachments nested.


This Actor collects publicly visible content from public Facebook groups. It does not join groups, bypass privacy settings, or access private data. Posts, comments and profile names relate to real people — if you process this data, make sure you have a lawful basis under GDPR and similar regimes, and comply with Facebook's terms and applicable law. If you supply cookies, you are responsible for that account's use.

Support

Need more comments per post, extra fields, or a custom group-monitoring pipeline? Open an issue on the Issues tab.