Facebook Group Posts and Details Scraper with Comments avatar

Facebook Group Posts and Details Scraper with Comments

Pricing

from $3.99 / 1,000 results

Go to Apify Store
Facebook Group Posts and Details Scraper with Comments

Facebook Group Posts and Details Scraper with Comments

Facebook Group Posts and Details Scraper with Comments extracts posts, comments, reactions, author details, timestamps, media, and engagement data from public Facebook groups. Export structured data to JSON, CSV, Excel, or integrate with your workflows.

Pricing

from $3.99 / 1,000 results

Rating

0.0

(0)

Developer

ScraperForge

ScraperForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

0

Monthly active users

3 days ago

Last modified

Share

Facebook Group Posts and Details Scraper with Comments — Posts, Comment Threads & Nested Replies

Scrape public Facebook groups and get more than a feed dump: each post arrives with its author, text, image, timestamp and group — plus a full comment thread, including nested replies, commenter profiles, like counts and threading depth.

Monitoring mode remembers what it has already seen, so scheduled runs return only genuinely new posts and only pay to read the comments underneath them.


What is Facebook Group Posts and Details Scraper?

This Actor reads a public Facebook group's feed through Facebook's own GraphQL interface, then walks each post's discussion.

Comments are handled in two stages, deliberately: a zero-extra-request preview is used first, and a dedicated comments query runs only when you ask for more than the preview contains. Replies are fetched through Facebook's separate reply-thread query and nested under each comment with a replyToCommentId and threadingDepth.

The result is a dataset where the conversation structure survives — you can see not just what was posted, but who responded, what they said, and who replied to whom.


What data can you extract?

Per post

FieldDescription
idFacebook post ID
postTextFull post text
imageAttached image URL
postAuthor, firstName, lastNameAuthor name, split into parts
postAuthorId, postAuthorUrlAuthor's Facebook ID and profile link
timestampPost creation time (epoch)
groupUrlWhich group the post came from
commentCountHow many comments were collected for this post
comments[]The comment thread (see below)
emailReserved field, returned empty

Per comment (and per reply)

FieldDescription
commentId, commentUrlComment identifier and permalink
commentTextComment body
commentTimestampISO timestamp
commenterName, commenterId, commenterProfileUrlWho wrote it
commenterProfilePictureAvatar URL
commentLikesCountLikes on the comment
replyCountTotal replies Facebook reports
threadingDepthNesting level
commentAttachmentUrlMedia attached to the comment
replies[]Nested replies, same shape

Why teams scrape Facebook group discussions

For market and customer research

Group threads are where people describe problems in their own words, unprompted and unfiltered by a survey. The comments matter more than the posts: a question with 80 replies is a map of what an audience actually believes, disagrees about and recommends.

For lead generation

Intent shows up in comments as often as in posts — "does anyone know a good…", "I've been looking for…". Because every comment carries commenterName and commenterProfileUrl, an intent search turns directly into a contact list.

For brand and competitor monitoring

Seeing your product mentioned is one thing; seeing how the group replies to that mention is the actual signal. Nested replies let you read the whole exchange rather than an isolated sentence.

For community managers

commentLikesCount, replyCount and threadingDepth quantify which topics generate real discussion versus polite acknowledgement — useful for planning what to post next.

For social researchers and data teams

Post text, comment text, reply structure, timestamps and engagement counts together make a genuinely rich conversational dataset, with the thread graph preserved through parentId and threadingDepth.


How to scrape a Facebook group step by step

  1. Open a public Facebook group and copy its URL, or note its identifier (the part after /groups/).
  2. Paste it into Facebook Group URLs or Identifiers — one per line for several groups.
  3. Set Maximum Posts. This is a global cap across the whole run, split across your groups.
  4. Leave Include Comment Threads on and set Max Comments Per Post; turn on Include Nested Replies for full threads.
  5. Optionally set a start date and a post sort order.
  6. Click Start, then export the Output tab as JSON (recommended — comments are nested) or CSV.

⬇️ Input

Example input

{
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"maxPosts": 50,
"sortOrder": "RECENT_ACTIVITY",
"includeComments": true,
"maxCommentsPerPost": 20,
"includeCommentReplies": true,
"commentsSortOrder": "all"
}

Input reference — posts

FieldTypeDefaultDescription
startUrlsarray— (required)Facebook group URLs or identifiers. Full URL (https://www.facebook.com/groups/name) or bare identifier (name). Multiple groups per run supported.
maxPostsinteger10Global cap across the whole run, minimum 10. With multiple groups the cap is split between them and the merged result is capped at this value. Example: maxPosts: 50 with 2 groups → roughly 25 each, ≤50 total.
sortOrderstringRECENT_ACTIVITYFeed ordering: RECENT_POSTS, TOP_POSTS, RECENT_ACTIVITY, CHRONOLOGICAL.
startDatestringOnly posts newer than this date (YYYY-MM-DD). Leave empty for no date filter.
monitoringModebooleanfalseRemembers post IDs already seen (in the Apify Key-Value Store) and skips duplicates on future runs. Comment threads are fetched only for the new posts that survive the filter.

Input reference — comments

FieldTypeDefaultDescription
includeCommentsbooleantrueAdds a comments list and commentCount to every post. Turn off for a posts-only run with no extra requests.
maxCommentsPerPostinteger20Cap on top-level comments per post, minimum 1. Replies are counted separately.
includeCommentRepliesbooleantrueAlso collect replies under each fetched comment, nested in comments[].replies. Off is faster and cheaper.
commentsSortOrderstringallFacebook's comment ordering: most_relevant, newest or all.

Network

FieldTypeDefaultDescription
proxyConfigurationobjectApify ResidentialThis Actor always uses residential proxy regardless of your selection. Configure Apify Proxy credentials if needed.

⬆️ Output

Where the data lands

  • Default dataset — one row per post, with the comment thread nested inside it. These are the charged rows.
  • Per-run child dataset (named <runId>-comments) — the same comments and replies flattened into individual rows, labelled type: "comment" or type: "reply", isChild: true, with postId, parentId and groupUrl. This mirror is not charged — it exists so comment data is easy to query flat without paying twice.

Example output — post row

{
"id": "1234567890123456",
"postText": "Batch-cooked 12 portions of chilli for under £14 this week — full breakdown in the comments!",
"image": "https://scontent.xx.fbcdn.net/…",
"postAuthor": "Jamie Example",
"firstName": "Jamie",
"lastName": "Example",
"postAuthorId": "100001234567890",
"postAuthorUrl": "https://www.facebook.com/profile.php?id=100001234567890",
"timestamp": 1786451351,
"groupUrl": "https://www.facebook.com/groups/cheapmealideas/",
"email": "",
"commentCount": 2,
"comments": [
{
"commentId": "Y29tbWVudDoxMjM0",
"commentUrl": "https://www.facebook.com/groups/cheapmealideas/posts/1234567890123456/?comment_id=1234",
"commentText": "This is genuinely useful — what supermarket?",
"commentTimestamp": "2026-08-06T18:22:11Z",
"commenterName": "Priya Example",
"commenterId": "100009876543210",
"commenterProfileUrl": "https://www.facebook.com/priya.example",
"commenterProfilePicture": "https://scontent.xx.fbcdn.net/…",
"commentLikesCount": 18,
"replyCount": 1,
"threadingDepth": 0,
"commentAttachmentUrl": null,
"replies": [
{
"commentId": "Y29tbWVudDo1Njc4",
"commentText": "Aldi — the dried beans are the trick.",
"commenterName": "Jamie Example",
"commentLikesCount": 6,
"threadingDepth": 1,
"replyToCommentId": "Y29tbWVudDoxMjM0"
}
]
}
]
}

Illustrative values — a live run returns current Facebook data.


Usage recipes

Daily monitoring that only pays for new content

{
"startUrls": ["https://www.facebook.com/groups/yourniche/"],
"maxPosts": 200,
"monitoringMode": true,
"sortOrder": "RECENT_POSTS",
"includeComments": true,
"maxCommentsPerPost": 10
}

Monitoring mode is the key setting here: comment threads are fetched only for posts that are actually new, so a scheduled run does not re-read discussions it has already collected.

Deep-dive one high-engagement thread set

{
"startUrls": ["https://www.facebook.com/groups/yourniche/"],
"maxPosts": 10,
"sortOrder": "TOP_POSTS",
"maxCommentsPerPost": 100,
"includeCommentReplies": true,
"commentsSortOrder": "most_relevant"
}

Fast, posts-only export

{
"startUrls": ["group-one", "group-two", "group-three"],
"maxPosts": 300,
"includeComments": false
}

Turning comments off removes all extra requests — the fastest and cheapest way to build a large post corpus.

Recent history only

{
"startUrls": ["https://www.facebook.com/groups/yourniche/"],
"startDate": "2026-07-01",
"sortOrder": "CHRONOLOGICAL",
"maxPosts": 500
}

Lead mining from comments

Run with comments on, open the child <runId>-comments dataset, and filter commentText for intent phrases. commenterProfileUrl is your contact path.


How does this compare to Facebook's Graph API?

Facebook's Graph API can read group content only for groups your app has been installed into by an admin, with reviewed permissions. There is no sanctioned way to read an arbitrary public group you do not administer, and the group-content permissions have been progressively restricted.

This Actor reads the publicly visible group feed — the same content a logged-out visitor can see — which is why it needs no app, no review and no admin cooperation. The trade-off is that it is bound by what Facebook shows publicly and by anti-automation defences, which is why residential proxy is enforced and why coverage can be partial on a blocked route.


Integrate and automate

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_API_TOKEN>")
run = client.actor("scraperforge/facebook-group-posts-and-details-scraper").call(run_input={
"startUrls": ["https://www.facebook.com/groups/cheapmealideas/"],
"maxPosts": 50,
"includeComments": True,
"maxCommentsPerPost": 20,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
print(post["postAuthor"], "|", post["commentCount"], "comments |", post["postText"][:70])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_API_TOKEN>' });
const run = await client.actor('scraperforge/facebook-group-posts-and-details-scraper').call({
startUrls: ['https://www.facebook.com/groups/cheapmealideas/'],
maxPosts: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

REST API

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

n8n, Make, Zapier and AI agents

Call the Actor from n8n, Make, Zapier or an MCP-capable agent through Apify's integrations. Monitoring mode plus a schedule makes a clean "new community discussions" trigger.

Schedules and webhooks

Attach a Schedule with monitoringMode: true for continuous community monitoring, and use webhooks to notify your stack when a run finishes. Results can also flow into Google Sheets, Airtable, Slack or Google Drive.


Pricing and what you are charged for

Pay-per-event: a small Actor-start charge plus a charge per post row in the default dataset.

Two things worth knowing:

  • Comments are not charged separately. They travel inside the post row, and the flattened child dataset is a free mirror — raising maxCommentsPerPost deepens your data without increasing the billed row count.
  • maxPosts is the cost lever, and monitoringMode is the cheapest way to run continuously, because repeat posts are skipped entirely.

Current rates are on the Pricing tab of this Actor's page, and Apify shows an estimate before and during every run. Residential proxy traffic is billed separately by the platform.


Limits, reliability and blocking

  • Public groups only. Private and closed groups require membership and are not accessible.
  • Reliability varies with Facebook's anti-automation. Residential proxy is enforced for that reason, and you should not expect every run to reach maxPosts — comment coverage in particular can be partial on a blocked route. This is stated up front because it is normal behaviour, not a defect.
  • maxPosts is a global cap, split across groups — not a per-group limit.
  • Minimum 10 posts; maxCommentsPerPost minimum 1.
  • Replies cost extra requests. Turning includeCommentReplies off noticeably speeds up large runs.
  • The child comments dataset is per run (<runId>-comments) — it is not a single cumulative dataset across runs.
  • Media URLs point at Facebook's CDN and expire; download assets promptly if you need them.
  • Default run options are 4 GB memory and a 1-hour timeout; raise the timeout for deep comment runs.

This Actor collects publicly visible content from public Facebook groups — posts and comments any logged-out visitor can read. It does not log in, join groups, or bypass privacy settings.

Comment data is personal data about identifiable people, and often more sensitive than post data: names, profile links, opinions and health, financial or family details shared in community discussions. If you process it, ensure you have a lawful basis under GDPR and comparable regimes, minimise what you store, keep it secure, honour deletion requests, and do not repurpose community conversations for unsolicited marketing. You are responsible for ensuring your use complies with Facebook's terms and applicable law.


❓ Frequently asked questions

Do I need Facebook cookies or a login?

No. The Actor reads public group content without authentication.

Can it scrape private or closed groups?

No. Only public groups are accessible.

Are replies really nested, or flattened?

Both, deliberately. In the default dataset they are nested under comments[].replies with replyToCommentId and threadingDepth. In the free per-run child dataset they are flattened into individual rows with parentId, so you can query them in a spreadsheet without unnesting.

Does fetching more comments cost more?

No. Charging is per post row; comments ride inside it and the child mirror is uncharged.

What does monitoring mode actually remember?

Post IDs it has already returned, stored in the Apify Key-Value Store. On the next run those posts are skipped, and comment threads are fetched only for the new ones.

Why did my run return fewer posts than maxPosts?

Either the group had fewer available posts, your startDate filtered them out, or Facebook throttled part of the run. All three are normal — the run still finishes successfully with what it collected.

Which post sort order should I use?

RECENT_POSTS or CHRONOLOGICAL for monitoring, TOP_POSTS for the highest-engagement content, RECENT_ACTIVITY (the default) for threads that are actively being discussed right now.

Can I get commenter e-mail addresses?

No. Facebook does not publish them, and the email field on post rows is a reserved placeholder that is always empty.

Can I scrape several groups at once?

Yes — add them all to startUrls. Remember that maxPosts is shared across them, not applied per group.

Which export format should I use?

JSON for the default dataset, since comments and replies are nested. If you want a flat spreadsheet of the discussion, export the <runId>-comments child dataset instead.


Browse the full collection on the ScraperForge profile.


💬 Feedback

Need deeper comment pagination, reaction breakdowns, or a custom community-monitoring pipeline? Open an issue on the Issues tab of this Actor.